2017-01-31 8 views

答えて

8
User.where(id: 123).update_all('views = views + 1') 

これは、次のクエリを生成します:

UPDATE users SET views = views + 1 WHERE users.id = 123 
+1

この他の利点は、競合状態がないことです。これはアトミックアップデートです。また、一回の 'update_all'呼び出しでこれを行うこともできます.2番目の引数はスコープですが、これは' where'でよりよく見えます。 – tadman

2
User.connection.execute(%| 
    UPDATE users SET views = views + 1 WHERE id = 123 
|) 
3

レールのことで、数値フィールドをインクリメントするために、専用のメソッドincrement_counterを持っています1:

User.increment_counter(:views, 123) 
# UPDATE `users` SET `views` = COALESCE(`views`, 0) + 1 WHERE `users`.`id` = 123 

COALESCE(`views`, 0)NULLでも動作します。

-1
+0

あなたの答えは、残念ながら間違っています - このクエリで 'views'を更新しないで、' views'のインクリメントされた値だけを返します。 'User.find(123)'を実行すると、変更されていない 'views'カラムを持つユーザが返されます。 –

+0

'increment!'は更新されますが、 'increment'は更新されません – Anton

関連する問題