1

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

似乎是什么问题?

4

1 回答 1

1

这篇文章帮助我解决了这个问题。

未触发子回调,因为父级不是“脏”的。

文章中的解决方案是通过调用 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

于 2016-07-28T13:22:17.940 回答