0

私のRailsアプリにはこれがあります:

class Invoice < ActiveRecord::Base

  has_many :payments

  before_save :save_outstanding_amount

  def save_outstanding_amount # atomic saving
    self.outstanding_amount = new_outstanding_amount
  end

  def update_outstanding_amount # adds another SQL query
    update_column(:outstanding_amount, new_outstanding_amount)
  end

  private

    def new_outstanding_amount    
      total - payments.sum(&:amount)
    end

end

Invoice最初のメソッドがクラスのすべてのインスタンスから呼び出され、2 番目のメソッドが他のクラス (クラスなど) のすべてのインスタンスから呼び出されるように、これを動的にするにはどうすればよいPaymentでしょうか?

4

1 に答える 1

0

あなたはここで非常に危険なことをしています。新しい値を設定する代わりに、SQL を使用して値を変更してください。

以下を想像してください: 請求金額: 1000 ユーザー 1 は 100 を差し引きますが、非常に遅い要求でそれを行います。ユーザー 1 が開始した直後に、ユーザー 2 が 500 を差し引き、非常に迅速に実行します。

アプリケーション内でこのようなことを行っているため、最後に実行されたメソッドであるため、900 という未処理の金額が発生します。update_counters は「安全な」SQL クエリを作成します。

self.class.update_counters self.id, payments.sum(&:amount)

これにより、2 つのクラスからそれらを呼び出す方法に関する質問も解決されます。これらの列は常にこのように更新してください。

于 2013-10-26T13:11:25.813 に答える