在 Rails 中为带有计数器的模型实现原子插入/更新的最佳方法是什么?我试图解决的问题的一个很好的类比是具有两个字段的“喜欢”计数器:
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 级别实现它(从而失去一些可移植性)?