Rails 嵌套模型更新不使用子控制器。叫什么?

Rails nested model updates do not use child controller. What is being called?

我有一个 Recipes 模型和一个 Ingredients 模型。成分 belongs_to 食谱和食谱 has_many 成分。一切正常。正在更新嵌套属性。

但是我的嵌套模型有一个属性,我想在它存储到数据库中之前对其进行操作。我在 IngredientsController 更新方法中有代码来处理这个。

我原以为 RecipeController 的更新方法会在更新嵌套成分时调用 IngredientController 的更新方法。这显然不会发生。

在更新过程中我可以使用什么机制来操作嵌套模型对象?

更多详情: 我将成分数量作为浮点数存储在数据库中 (1.25、0.33333、3.5、4.0 等)。 我希望用户能够看到和编辑该值作为一个草率的分数 (1 1/4、1/3、3 1/2、4)。

所以我写了String.to_f_sloppy和Float.to_s_sloppy函数来操作数字。显示上,没有问题,我直接用ingredient.quantity.to_s_floppy。但是当有人编辑成分并更改数量时,当它到达 before_update 和 before_validation 函数时,值已经改变(就像它是 运行 到 to_f)。

以下是通过的参数: 参数:{"utf8"=>"√", "authenticity_token"=>"ojOwp68P3ObiufowfKtbfYxpV31+vZPz64qYQAL/1ld8Px93OrDX2Gvy/yxljENJOhiLW3DUoE0C2upvHuF3CA==", "recipe"=>{"user_id"=>"1", "name"=>"Chicken Piccata", "description"=>"", "category"=>"entree", "yield"=>"4.0", "ingredients_attributes"=>{"0"=>{"recipe_id"=>"12", "name"=>"去皮去骨鸡胸肉", "unit_id"=>"40", "quantity"=>"2 1/2", "comment"=>"", "_destroy"=>"0", "id"=>"122"}}}, "commit"=>"Save Recipe", "id"=>"12"}

在ingredients.rb中,我有:

class Ingredient < ActiveRecord::Base
  belongs_to :unit
  belongs_to :recipe
  before_update :translate_quantity

  def translate_quantity
    puts "UPDATE QUANTITY IS #{self.quantity}"
  end
end

这输出: 更新数量为 2.0

所以在我得到值之前,它已经被改变了。

您可以使用 Activerecord 的回调,这些回调是在模型上实现的,它允许您使用它们修改记录。

你想要的是 before_update 回调。

更多信息here

像这样。

class Ingredient < ActiveRecord::Base
  ...
  before_update :stuff

  private
    def stuff
      # do stuff
    end
end

我找到了解决方案。我使用了这个答案:

How can I override the attribute assignment in an active record object?

要覆盖模型中的行为:

def quantity=(value)
    super(value.to_f_sloppy)
end