我有一张名为'position'的牌桌,其默认值为0.
我需要选择一组卡片,然后使用递增的值指定每张卡片的位置。
所以,假设我选择了一组牌
cards = Card.where(id: [3,4,7,8]).
单个Activerecord或SQL语句可以分配一个递增的值,这会产生这样的结果吗?
cards[0].position
=> 1
cards[1].position
=> 2
...
答案 0 :(得分:0)
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工作。