Jaki jest najlepszy sposób na wprowadzenie wkładki atomowej/aktualizacji dla modelu z licznikiem w Railsach? Dobrą analogią do problemu próbuję rozwiązać jest „podobny” licznik z dwóch pól:Wkładka atomowa lub inkrementacja w ActiveRecord/Rails
url : string
count : integer
Upon wkładki, jeśli nie jest obecnie rekord z pasującym url, nowy rekord należy stworzyć z policzeniem 1; w przeciwnym razie pole rekordu count
powinno zostać zwiększone.
Początkowo próbowałem kod jak poniżej:
Like.find_or_create_by_url("http://example.com").increment!(:count)
Ale nic dziwnego, uzyskany SQL pokazuje, że SELECT
dzieje poza transakcją 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
istnieje idiom Szyny do czynienia z to, czy też muszę to wdrożyć na poziomie SQL (a tym samym stracić trochę przenośności)?
4 lata później wciąż szukam spójnej/wspieranej przez społeczność odpowiedzi. –