0

Railsアプリケーションに、ネストされたモデルMeasuresを持つモデルEntryがあり、各エントリが_manyメジャー(およびメジャーbelongs_toエントリ)を持っているとします。

各メジャーには独自のインセンティブがあります。エントリにインセンティブとも呼ばれる整数があり、その値がすべてのメジャーの合計に等しい可能性はありますか?これをどのように達成しますか?

私には、この種の質問は2つの部分に分かれているように思われます。送信時にモデルフィールドを別のフィールド値に基づいて定義するにはどうすればよいですか。次に..送信時に、ネストされたモデルの値に基づいて値を定義するにはどうすればよいですか?

4

1 に答える 1

1

ネストされた属性のモデルを使用してコールバックを実装してみてくださいafter_update。これにより、親が更新されます。

class Measure < ActiveRecord::Base
  after_update :calculate_measure_sum

  ...
  private

  def calculate_measure_sum
    # calculate sum
    self.entry.save
  end
end

コールバックでも同じメソッドを使用する必要がある場合がありafter_createます。

編集:

別の質問touchで読んだ後、私のアプローチを更新したいと思います:

class Entry < ActiveRecord::Base
  has_many :measures
  after_touch :calculate_measure_sum

  ...
  private

  def calculate_measure_sum
    # calculate sum
    self.entry.save
  end
end

class Measure < ActiveRecord::Base
  belongs_to :entry, touch: true
  ...
end

ここで何が起こるかというと、メジャーが作成または編集されるたびに、touchメソッドを呼び出すことによってメジャーが更新されたことをエントリに通知します。エントリではafter_touch、メジャーの合計を再計算するためにコールバックを使用する場合があります。after_touch-callbackは、メジャーの作成、削除、および変更時に呼び出されることに注意してください。

私の以前のアプローチと比較して、このアプローチはエントリオブジェクトに責任を負わせます。これは設計の観点から有利です。

于 2012-11-28T01:51:59.520 に答える