Techioz Blog

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()

必要な変更を加えて更新します。