9

モデルに has_many 関連付けを持つテーブル 'orders' と 'items' があります。

class Order < ActiveRecord::Base
has_many :items

class Item < ActiveRecord::Base
belongs_to :order

アイテムは「数量」フィールドで構成され、注文は「quantity_sum」フィールドで構成され、関連付けられたアイテムの数量の合計を追跡します。

例:

Order 1 : name='Toms shopping cart', quantity_sum=12
Item 1 : name='T-shirt', quantity=10
Itme 2 : name='Shoes',   quantity=2

新しいアイテムが追加/編集/削除されるたびに、注文の「quantity_sum」フィールドが自動的に更新されるようにする方法を探していました。現在、注文の「quantity_sum」フィールドを更新するために、Item で after_save メソッドを使用しています。

「after_save」以外にこれを行う適切な方法はありますか???

関連の数を追跡するための「counter_cache」と同様に、レールは関連内のいくつかのフィールドの合計を自動的に追跡することをサポートしていますか?

ありがとう

4

2 に答える 2

3

テーブルからquantity_sumフィールドを削除し、quantity_valuesを合計する注文クラスにquantity_sumメソッドを追加します

class Order < ActiveRecord::Base
  has_many :items

  def quantity_sum
    self.items.sum(:quantity)
  end
end

トリックを行う必要があります。次に行う必要があるのは、quantity_sum フィールドを更新するコードを削除することだけです。メソッドの名前がフィールド名と同じであるため (削除することを忘れないでください)、それを使用するコードをリファクタリングする必要がないことがわかります。

明らかに、システム内のすべての注文のリストのように、このフィールドを不必要に使用しないように注意する必要があります。これは、データベースに非常に負担がかかるためです。数百のレコードでは問題ありませんが、数千の注文でパフォーマンスの問題に気付くでしょう。

注文テーブルからその quantity_sum フィールドを削除することを忘れないでください

于 2011-08-08T12:40:54.387 に答える