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
我有一个 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