ActiveRecord發update請求的原子操作

洪亮發表於2019-02-16

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

相關文章