Railsコールバックを正しく実装する方法に少し苦労しています:
モデル X (属性 A、B、C を持つ) とモデル Y (属性 C、D、E を持つ - つまり、両方とも属性 C を持つ) との has_many 関係があります。関連するすべてのモデル Y の属性 C がモデル X の属性と一致する必要があることを示す X のモデル検証があります。
したがって、モデル X の更新中に C 属性を変更する際に、'before_validation, on :update' コールバックを使用して、関連するすべての Y モデルの C 値を変更し、モデル X の更新された C 値と一致させました。これにより、 model X を検証して正常に更新します。ただし、関連付けられたモデル Y の変更された C 値は保持されず、モデル X のリロード時に元の値に戻ります。
では、モデル Y の変更を「ロックイン」するために「after_save」コールバックも必要ですか? それとも、この種のことを行うために別の方法を使用する必要がありますか?
- - - アップデート - - - - - -
データベースへの保存が間違っている可能性があると思います:
私のコールバックコード
class X
....
before_validation :update_Ys, on: :update
....
def update_Ys
self.Ys.each do |k|
k['C'] = self.C
k.save
end
end