模型回调不适用于自引用关联
Model callbacks not working with self referential association
我有一个模型 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|
...
似乎是什么问题?
这 article 帮助我解决了这个问题。
未触发子回调,因为父不是 "dirty"。
文中的解决方法是"force"调用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
我有一个模型 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|
...
似乎是什么问题?
这 article 帮助我解决了这个问题。
未触发子回调,因为父不是 "dirty"。
文中的解决方法是"force"调用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