Qual è il modo migliore per implementare un inserto/aggiornamento atomico per un modello con un contatore in Rails? Una buona analogia per il problema che sto cercando di risolvere è un "come" bancone con due campi:Inserimento o incremento atomico in ActiveRecord/Rails
url : string
count : integer
Su inserto, se non v'è attualmente un record con un URL corrispondente, deve essere creato un nuovo record con conteggio 1; altrimenti il campo count
del record esistente deve essere incrementato.
Inizialmente ho provato il codice come il seguente:
Like.find_or_create_by_url("http://example.com").increment!(:count)
Ma non sorprende, il codice SQL risultante mostra che il SELECT
accade al di fuori del UPDATE
transazione:
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
C'è un idioma Rails per affrontare questo, o devo implementarlo a livello SQL (e quindi perdere una certa portabilità)?
4 anni dopo, ancora alla ricerca di una risposta coerente/supportata dalla comunità. –