0

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
4

2 に答える 2

0

私がやったことは、2つのコールバックを持つことでした

まず、'before_validation, on :update' で、

def update_Ys
  self.Ys.each do |k|
    k['C'] = self.C 
  end
end

これにより、モデル X の検証が可能になりました

次に、「after_save」で、更新されたモデル Ys を保存してデータベースに直接アクセスします。これが最善の方法ではないと思うので、これを改善する方法について誰かアドバイスがあれば教えてください。

于 2014-05-28T06:22:29.243 に答える