Ruby on rails 3 Rails 3:保存前的条件和

Ruby on rails 3 Rails 3:保存前的条件和,ruby-on-rails-3,function,Ruby On Rails 3,Function,我花了很长时间来寻找,但是我被卡住了 在将产品保存到数据库之前,我想计算产品的基本价格,但我想使总和以变量表中的必填字段为条件 以下是相关代码: class Product < ActiveRecord::Base has_and_belongs_to_many :variants before_save :calculate_price private def :calculate_price self.base_price = variants.where

我花了很长时间来寻找,但是我被卡住了

在将产品保存到数据库之前,我想计算产品的基本价格,但我想使总和以变量表中的必填字段为条件

以下是相关代码:

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
:必需是变量中的布尔字段

该语句适用于已保存的产品,但不适用于尚未创建的产品。因此,当我创建产品时,价格为$0,更新时,基本价格计算正确


有人能帮忙吗?

我总是把自己和不同类型的回调混在一起。通常,当我想从其他属性计算属性时,我会在验证之前使用。之前,保存似乎更适合,但我从未让它按我想要的方式工作。

所以问题是,当你做[self.]变体时。在哪里。。。在产品中,您隐式地执行一个查询,如SELECT*FROM variants,其中id={Product.id}和…,但由于产品尚未保存,因此它还没有id

但是,如果您为控制器中的新产品分配了变量,从而使其self.Variants集合中有项目,并且这些变量的:required属性设置正确,则您可以像使用任何其他数组一样使用Enumerableselect对其进行筛选,例如:

def :calculate_price
  self.base_price = variants.to_a.select( &:required ).sum &:price_fixed
end

在何处/何时将变体分配给新产品?在产品控制器中将变体分配给产品。现在,在保存之前,我想更新产品的基本价格。这个问题似乎与.where:required=>true有关。