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 回答