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

당신이 어떻게 하위 평가를 업데이트 보여줄 수 레일 API에 Active Model Dirty를 참조하십시오

여기

업데이트 된 모델 코드인가? –

+0

이것을 재현 할 수 없습니다. 'before_save'는 내용이 업데이트 된 모든 자식에 대해 호출됩니다. 'sub_evaluations_attributes'에'id'를 허용했는지 확인해야합니다. –

+0

sub_evaluations_attributes에 ID를 허용했습니다. 레일즈 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