相关疑难解决方法(0)

ActiveRecord/Rails中的原子插入或增量

在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级别实现此功能(从而失去一些可移植性)?

activerecord ruby-on-rails-3

9
推荐指数
3
解决办法
6240
查看次数

标签 统计

activerecord ×1

ruby-on-rails-3 ×1