Was ist der beste Weg, um ein atomisches Einfügen/Update für ein Modell mit einem Zähler in Rails zu implementieren? Eine gute Analogie für das Problem zu lösen, ich versuche ein „wie“ Zähler mit zwei Feldern:atomisches Einfügen oder Inkrementieren in ActiveRecord/Rails
url : string
count : integer
Beim Einsatz, wenn es nicht noch ein Datensatz mit einer passenden URL ist, sollte ein neuer Datensatz erstellt werden mit Zählung 1; Andernfalls sollte das Feld count
des vorhandenen Datensatzes inkrementiert werden.
Zunächst versuchte ich Code wie folgt aus:
Like.find_or_create_by_url("http://example.com").increment!(:count)
aber wenig überraschend, zeigt die resultierende SQL, dass die SELECT
außerhalb der UPDATE
Transaktion geschieht:
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
Gibt es eine Rails Idiom für den Umgang mit oder muss ich das auf SQL-Ebene implementieren (und damit die Portabilität verlieren)?
4 Jahre später, immer noch auf der Suche nach einer konsistenten/Community-unterstützte Antwort. –