用ActiveRecord修改一條資料庫記錄通常都會發出這種SQL:
UPDATE `posts` SET `posts_count` = 1 WHERE `id` = 38
如果要發出這種:
UPDATE `posts` SET `posts_count` = `posts_count` + 1 WHERE `id` = 38
就需要使用increment_counter/decrement_counter方法:(注意,這倆都是類方法,使用時要傳入物件ID)
Post.increment_counter :posts_count , 38
生成的SQL如下:
UPDATE `posts` SET `posts_count` = COALESCE(`posts_count`, 0) + 1 WHERE (`id`= 38)
這樣就是安全的原子增量操作了。COALESCE()函式是用來防止欄位為NULL引起錯誤的。如果需要對一條記錄同時操作多個欄位,則需要使用update_counters
方法:(也是類方法,ID作為第一個引數傳入)
Post.update_counters 38 , :posts_count => 2 , :update_calls_count => 1
生成的SQL如下:
UPDATE `posts` SET `posts_count` = COALESCE(`posts_count`, 0) + 2, `update_calls_count` = COALESCE(`update_calls_count`, 0) + 1 WHERE (`id` = 38)