Rails 3:条件求和before_save

时间:2012-01-15 22:13:28

标签: ruby-on-rails-3 function

我花了很长时间搜索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计算正确。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我总是把自己与不同类型的回调混在一起。通常,当我想从其他属性计算属性时,我会使用before_validationbefore_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