Rails: group by 句を使用してレコードが取得されている間に、複数のレコードの単一列の値を更新します
概要
group by 句を使用してテーブルからデータを取得しており、その後、最初のクエリで取得されたすべてのレコードの単一の列の値を更新したいと考えています。
したがって、最初のクエリからレコードを更新するまで、新しい行が追加されていないことを確認する必要があります。
説明: モデル Test に次の 5 つの列があるとしましょう: Id A B C Status
そこで、まず次のようにクエリします。
Test.select('count(*), A, B').where(status:'new', C: 'value').group('A, B')
コードでグループを処理した後、最初のクエリで使用されたすべてのレコードのステータスを完了に変更したいと考えています。
問題は、次のようにした場合です。
Test.where(status: 'new', C: 'value')
update_all を使用するには、この条件に一致する最初のクエリ以降、新しいレコードがテーブルに追加された可能性があります。最初のクエリでは処理されなかったため、実際には処理されませんでしたが、ステータスを「完了」に設定します。存在する。
したがって、基本的には、最初のクエリから更新までテーブルの挿入をロックするか、クエリごとにグループ内で「考慮された」IDのリストを何らかの方法で取得する方法が必要です。
それ、どうやったら出来るの?
解決策
最初のクエリの select ステートメントから id も選択することをお勧めします。
Test.select('count(*), A, B, Id').where(status:'new', C: 'value').group('A, B').
上記のクエリから ID を選択します。次に、別のクエリを使用して ID を更新します。
Test.where("Id IN ?", ids ).update_all()
必要な変更を加えて更新します。