我的模型Evaluation
有很多子评价(自我反射)
class Evaluation < ApplicationRecord
has_many :sub_evaluations, class_name: "Evaluation", foreign_key: "parent_id", dependent: :destroy
before_save :calculate_score
def calculate_score
# do something
end
end
我正在使用子评估创建和更新评估作为嵌套属性。
calculate_score
方法在创建子评估时触发,但在更新时不触发。我尝试过before_update
和after_validation
。但似乎没有任何工作。
评估表
= form_for @evaluation do |f|
...
= f.fields_for :sub_evaluations do |sub_evaluation|
...
似乎是什么问题?
答案 0 :(得分:1)
这article帮助我解决了这个问题。
未触发子回调,因为父级不是“脏”。
本文中的解决方案是通过调用attr_name_will_change来“强制”它变脏!在父属性上,事实上,它不会改变。
以下是更新的型号代码:
class Evaluation < ApplicationRecord
has_many :sub_evaluations, class_name: "Evaluation", foreign_key: "parent_id", dependent: :destroy
before_save :calculate_score
def calculate_score
# do something
end
def exam_id= val
exam_id_will_change!
@exam_id = val
end
end
请参阅Rails API中的Active Model Dirty