Railsにカウンターがあるモデルのアトミック挿入/更新を実装するための最良の方法は何ですか?私が解決しようとしている問題の良い例えは、2つのフィールドを持つ「like」カウンターです。
url : string
count : integer
挿入時に、現在URLが一致するレコードがない場合は、カウント1で新しいレコードを作成する必要があります。それ以外の場合は、既存のレコードのcount
フィールドをインクリメントする必要があります。
最初は次のようなコードを試しました。
Like.find_or_create_by_url("http://example.com").increment!(:count)
しかし、当然のことながら、結果のSQLは、トランザクションのSELECT
外部で発生することを示しています。UPDATE
Like Load (0.4ms) SELECT `likes`.* FROM `likes` WHERE `likes`.`url` = 'http://example.com' LIMIT 1
(0.1ms) BEGIN
(0.2ms) UPDATE `likes` SET `count` = 4, `updated_at` = '2013-01-17 19:41:22' WHERE `likes`.`id` = 2
(1.6ms) COMMIT
これに対処するためのRailsイディオムはありますか、それともSQLレベルでこれを実装する必要がありますか(したがって、移植性がいくらか失われます)?