Mis*_*hko 9 ruby-on-rails ruby-on-rails-3
Buyer
model有两个字段:
我想增加position
所有买家的position >= N
.
最简单的方法是什么?
是否可以仅使用一个查询来实现此目的?
Sea*_*ill 17
你可以使用:
Buyer.update_all("position = position + 1", ["position >= ?", n])
Run Code Online (Sandbox Code Playgroud)
如果n = 25,这将生成查询:
UPDATE "buyers" SET position = position + 1 WHERE (position >= 25)
Run Code Online (Sandbox Code Playgroud)
编辑:
由于您具有UNIQUE数据库约束,因此您有几个选项.对于这两个选项,我建议在事务中运行它们.首先,您可以按相反的顺序单独更新每个字段,但这将导致您有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
Run Code Online (Sandbox Code Playgroud)
避免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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6598 次 |
最近记录: |