模型回调不适用于自引用关联

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_updateafter_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