Railsにカウンタを持つモデルのアトミック・インサート/更新を実装する最良の方法は何ですか?現在、一致するURLを持つレコードが、新しいレコードを作成する必要がない場合には、挿入時にActiveRecord/Railsのアトミック・インサートまたはインクリメント
url : string
count : integer
:私が解決しようとしている問題のための良いアナロジーは、2つのフィールドを持つ「のような」カウンタですカウント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レベルでこれを実装する必要があります(したがって、移植性が失われます)。
4年後、一貫した/コミュニティサポートの回答を探していました。 –