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