0

データベース テーブルの属性をインクリメントする単純なループを実行しようとしていますが、期待どおりにインクリメントされません。私たちのアプリケーションが日替わりセールサイトだと想像してください。記録のために、Rails 3.0.1 を使用しています。

class Deal
  has_many :orders
end

class Order
  belongs_to :deal
end

注文には「数量」という属性もあります。たとえば、誰かが同じものをいくつか購入した場合などです。誰かがショッピング カートで大量の注文を購入した場合、各取引の合計を集計して、各取引で販売した数を追跡します。

@new_orders.each do |order|
  order.deal.update_attribute(:order_count, order.deal.order_count + order.quantity)
end

まず、これを書くためのより良い方法があるかもしれないという事実を無視してください。これは、私の要点を理解するために考案された例です。

ここで、誰かがショッピング カートで同じ取引を 3 回購入した場合を想像してみてください (正当な理由はありません。この例は多少不自然です)。そして、各注文の数量が 1 であるとしましょう。

ループの最後に、取引の数量が 3 になると予想していました。しかし、このコードをテスト、ブラウザー、またはコンソールで実行すると、1 になります。

ループの各反復で、「order.deal」をプルするように見えます。各注文がたまたま同じ取引に属しているため、キャッシュから取引をプルしています。このループが始まる前に、取引の order_count が 0 だったとしましょう。order_count が 0 の取引のキャッシュされたコピーをプルするたびに。

これは予想される動作ですか?このタイプのキャッシュをオフにする方法はありますか? さらに奇妙なのは、私の同僚が彼のプロジェクトで同様のループを実行しようとしたところ、予想どおりの合計が得られたことです。それとも、何かが完全に欠けていますか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

レコードを保存していません。インクリメント後(ただしループ内)、次のものが必要です。

order.deal.save

~~~~~~

あなたのコメントに基づく:

@new_orders.each do |order|
  order_quantity = order.quantity
  order.reload
  order.deal.update_attribute(:order_count, order.deal.order_count + order_quantity)
end

これにより、新しい注文数量が変数に保存され、データベースから注文が再ロードされてから更新が行われます。

于 2012-07-18T23:47:49.017 に答える