Activerecord或SQL - 使用单个语句以递增的值更新每个记录

时间:2016-12-09 15:22:59

标签: sql ruby-on-rails activerecord increment update-all

我有一张名为'position'的牌桌,其默认值为0.

我需要选择一组卡片,然后使用递增的值指定每张卡片的位置。

所以,假设我选择了一组牌

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

单个Activerecord或SQL语句可以分配一个递增的值,这会产生这样的结果吗?

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

1 个答案:

答案 0 :(得分:0)

ActiveRecord,不。

SQL,当然,永远。

此处ActiveRecord的问题在于您尝试同时做两件事。

  1. 使用单个查询更新记录。
  2. 使用n填写第一条记录,其中n += 1为每条记录。
  3. 问题在于,当我们查询时,我们将执行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工作。