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
的问题是您试图同时做两件事。
- 使用单个查询更新记录。
- 用
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 工作。
我有一张卡片 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
的问题是您试图同时做两件事。
- 使用单个查询更新记录。
- 用
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 工作。