Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRailsActiveRecord:按1优化增量_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails RubyonRailsActiveRecord:按1优化增量

Ruby on rails RubyonRailsActiveRecord:按1优化增量,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个条目ID,受欢迎程度必须增加一个 一个简单的解决方案如下所示: Tag.find(id).increment!(:popularity) 但是它似乎不是很有效,因为我从数据库中选择了整个条目(*)(尽管我根本不需要它),然后执行第二个查询来更新它 有没有更有效的方法?我认为,一条更新语句(不带“select”)就足够了,但我该如何编写它呢?可能类似于: Tag.update_all("popularity = popularity + 1", {:id => id}) 或 ?

我有一个条目ID,
受欢迎程度
必须增加一个

一个简单的解决方案如下所示:

Tag.find(id).increment!(:popularity)
但是它似乎不是很有效,因为我从数据库中选择了整个条目(*)(尽管我根本不需要它),然后执行第二个查询来更新它

有没有更有效的方法?我认为,一条更新语句(不带“select”)就足够了,但我该如何编写它呢?

可能类似于:

Tag.update_all("popularity = popularity + 1", {:id => id})

?


这不仅会跳过select,而且会自动递增。

不管您如何操作,您都要运行一个查询来查找要更新的正确行,因此我认为用其他更新方法替换
标记.find()
,不会有多大好处。如果您使用的是Rails 3,我的理解是AREL将这些东西链接在一起,以执行尽可能少的查询。但是您应该能够通过一个SQL查询做到这一点:“更新
标记
设置
流行度
=
流行度
+1其中
id
=X”-我是不是遗漏了什么?如果你想更改超过1,请参见
Tag.where(:id => id).update_all("popularity = popularity + 1")
Tag.increment_counter :popularity, id