以下ではデータベースを2回ヒットします。ActiveRecord update_column:1つのクエリで現在の値に応じてレコードの値を増やす方法
@user = User.find(123)
@user.update_column(:views, @user.views + 1)
このような何か:
User.find(123).update_column(:views, self.views + 1)
以下ではデータベースを2回ヒットします。ActiveRecord update_column:1つのクエリで現在の値に応じてレコードの値を増やす方法
@user = User.find(123)
@user.update_column(:views, @user.views + 1)
このような何か:
User.find(123).update_column(:views, self.views + 1)
User.where(id: 123).update_all('views = views + 1')
これは、次のクエリを生成します:
UPDATE users SET views = views + 1 WHERE users.id = 123
User.connection.execute(%|
UPDATE users SET views = views + 1 WHERE id = 123
|)
レールのことで、数値フィールドをインクリメントするために、専用のメソッドincrement_counter
を持っています1:
User.increment_counter(:views, 123)
# UPDATE `users` SET `views` = COALESCE(`views`, 0) + 1 WHERE `users`.`id` = 123
COALESCE(`views`, 0)
NULL
でも動作します。
User.find(123).increment(:views)
http://apidock.com/rails/ActiveRecord/Base/increment http://apidock.com/rails/ActiveRecord/Base/incrementを参照してください!
あなたの答えは、残念ながら間違っています - このクエリで 'views'を更新しないで、' views'のインクリメントされた値だけを返します。 'User.find(123)'を実行すると、変更されていない 'views'カラムを持つユーザが返されます。 –
'increment!'は更新されますが、 'increment'は更新されません – Anton
この他の利点は、競合状態がないことです。これはアトミックアップデートです。また、一回の 'update_all'呼び出しでこれを行うこともできます.2番目の引数はスコープですが、これは' where'でよりよく見えます。 – tadman