在Rails中使用计数器为模型实现原子插入/更新的最佳方法是什么?我试图解决的问题的一个很好的比喻是一个"喜欢"的计数器,有两个字段:
url : string
count : integer
Run Code Online (Sandbox Code Playgroud)
插入时,如果当前没有匹配url的记录,则应创建一个计数为1的新记录; 否则现有记录的count字段应递增.
最初我尝试了如下代码:
Like.find_or_create_by_url("http://example.com").increment!(:count)
Run Code Online (Sandbox Code Playgroud)
但不出所料,生成的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
Run Code Online (Sandbox Code Playgroud)
是否存在用于处理此问题的Rails习惯用法,或者我是否需要在SQL级别实现此功能(从而失去一些可移植性)?