2016-07-28 12 views
1

私は多くのサブ評価(自己refential)モデルのコールバックは、自己参照協会

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 

私が作成し、ネストされた属性などのサブ評価で評価を更新していますを持っているモデルEvaluationを持っていて機能していません。

calculate_scoreサブ評価の作成時にメソッドがトリガーされますが、更新中はトリガーされません。私はbefore_updateafter_validationを試しました。しかし、何も働いていないようです。

評価フォーム

= form_for @evaluation do |f| 
    ... 
    = f.fields_for :sub_evaluations do |sub_evaluation| 
    ... 

問題のようですか?

+0

はあなたがサブ評価を更新しているかを示すことができましたか? –

+0

私はこれを再現できません。 'before_save'は内容が更新されるすべての子に対して呼び出されます。 'sub_evaluations_attributes'に' id'を許可したかどうかを確認することです。 –

+0

sub_evaluations_attributesにidを許可しました。私はあなたがRails 5でそれをチェックしていると思います。 – webster

答えて

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