データベース テーブルの属性をインクリメントする単純なループを実行しようとしていますが、期待どおりにインクリメントされません。私たちのアプリケーションが日替わりセールサイトだと想像してください。記録のために、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 の取引のキャッシュされたコピーをプルするたびに。
これは予想される動作ですか?このタイプのキャッシュをオフにする方法はありますか? さらに奇妙なのは、私の同僚が彼のプロジェクトで同様のループを実行しようとしたところ、予想どおりの合計が得られたことです。それとも、何かが完全に欠けていますか?
ご協力いただきありがとうございます!