Activerecord 或 SQL - 用一条语句用递增的值更新每条记录

Activerecord or SQL - update each record with an incremented value with a single statement

我有一张卡片 table,其属性名为 'position',默认值为 0。

我需要select一组卡片,然后给每张卡片的位置赋值。

所以,假设我 select 一组卡片使用

cards = Card.where(id: [3,4,7,8]). 

单个 Activerecord 或 SQL 语句是否可以分配递增的值,从而得到这样的结果?

cards[0].position 
=> 1
cards[1].position
=> 2  
...

ActiveRecord,没有。

SQL,当然,总是。

ActiveRecord 的问题是您试图同时做两件事。

  1. 使用单个查询更新记录。
  2. n 填充第一条记录,其中每条记录 n += 1

问题是当我们查询时,我们离开Ruby执行并进入SQL。

i = 1
Card.update_all(position: i+=1)

所有记录的更新值将为 2

用相同的值更新所有记录很容易,但是我们不会在这里用相同的值更新所有记录。

所以你不能这样使用ActiveRecord。

如果您想使用 Ruby 来保留计数器,您必须执行如下操作:

Card.find_each(where: [3,4]).with_index(1) do |card, index|
  card.update(position: index)
end

否则,您将需要做一些 SQL 工作。