0

我有一个卡片表,其属性名为“位置”,默认值为 0。

我需要选择一组卡片,然后为每张卡片的位置分配一个递增的值。

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

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

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

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

1 回答 1

0

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 工作。

于 2016-12-09T16:03:12.157 回答