Buyer
模型有两个字段:
我想增加position
在所有买家中position >= N
.
最简单的方法是什么?
是否可以仅使用一个查询来实现这一目标?
你可以使用:
Buyer.update_all("position = position + 1", ["position >= ?", n])
如果 n = 25,这将生成查询:
UPDATE "buyers" SET position = position + 1 WHERE (position >= 25)
Edit:
由于您有独特的数据库约束,因此您有几个选择。对于这两个选项,我建议在事务中运行它们。首先,您可以以相反的顺序单独更新每个字段,但这将导致您进行 N+1 次查询。对于小型数据集,这不会是问题,但对于较大的数据集,这可能会影响性能。
Buyer.transaction do
Buyer.select("id, position").where(["position >= ?", n]).order("position DESC").each do |buyer|
buyer.position += 1
buyer.save
end
end
为了避免 N+1 查询,另一个选项是将位置增量更改为 100(或 10)。这将允许您更新两个查询中的位置,而不是 N+1。因此,位置不再是 1、2、3 等,而是 100、200、300 等。然后要进行更新,请将所有值增加 101,然后在更新后进行更新以减去 1。
Buyer.transaction do
Buyer.where(["position >= ?", n]).scoping do
Buyer.update_all("position = position + 101")
Buyer.update_all("position = position - 1")
end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)