我花了很长时间搜索SO,但我被卡住了......
我希望在数据库中保存base_price
之前计算product
的{{1}},但我想在product
条件下计算总和变量表中的字段。
以下是相关代码:
required
class Product < ActiveRecord::Base
has_and_belongs_to_many :variants
before_save :calculate_price
private
def :calculate_price
self.base_price = variants.where( :required => true ).to_a.sum( &:price_fixed )
end
end
是:required
该声明适用于已保存的产品,但尚未创建尚未创建的产品。因此,当我创建产品时,价格为0美元,在更新时,variants
计算正确。
有人可以帮忙吗?
答案 0 :(得分:0)
我总是把自己与不同类型的回调混在一起。通常,当我想从其他属性计算属性时,我会使用before_validation
。 before_save
似乎更适应,但我从来没有按照我想要的方式工作。
答案 1 :(得分:0)
问题是,当您在[self.]variants.where(...)
中执行Product
时,您隐含地执行SELECT * FROM variants WHERE id = #{product.id} AND ...
之类的查询,但由于产品尚未保存,因此没有id
1}}。
但是,如果您将变量分配给控制器中的新产品(因此它的self.variants
集合中有项目),并且这些变体的:required
属性设置正确,则您只需过滤它像任何其他数组一样使用Enumerable#select
,例如:
def :calculate_price
self.base_price = variants.to_a.select( &:required ).sum &:price_fixed
end