Rails:如何增加模型的选定实例的整数字段?

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)