我正在使用group by子句从表中检索一些数据,之后我想更新初始查询检索到的所有记录的单个列值。
所以我需要确保自初始查询以来,直到我更新记录,没有添加新行。
说明:假设模型Test
有5列:Id A B C Status
首先我查询如下:
Test.select('count(*), A, B').where(status:'new', C: 'value').group('A, B')
在我处理代码中的组后,我想将初始查询used
的所有记录的状态更改为done
问题在于,如果我这样做:
Test.where(status: 'new', C: 'value')
为了现在使用update_all
,自从第一个回答这个条件的查询以来我有可能将新记录添加到表中,我将其状态设置为“完成”。虽然他们没有真正处理过,因为在最初的查询中他们并不存在。
所以基本上我需要一种方法从初始查询开始锁定表,直到更新或以某种方式得到一个被认为是""在查询组中。
我该怎么做?
答案 0 :(得分:0)
我建议在第一次查询中从select语句中选择id。
Test.select('count(*), A, B, Id').where(status:'new', C: 'value').group('A, B').
从上面的查询中选择ID。然后使用另一个查询来更新它们。
Test.where("Id IN ?", ids ).update_all()
根据您的要求进行必要的更改。