2011-02-24 113 views
13

我有一個條目ID,其中popularity必須加1。Ruby on Rails ActiveRecord:優化增量1

一個簡單的解決方案是這樣的:

Tag.find(id).increment!(:popularity) 

但是它似乎並沒有很有效的,因爲我從數據庫中選擇整個條目(*)(儘管我並不需要它完全),然後執行第二個查詢來更新它。

有沒有更有效的方法來做到這一點?我認爲,一個更新陳述(沒有「選擇」)應該足夠了,但我該怎麼寫呢?

+0

那麼,你將運行一個查詢來找到正確的行來更新,無論你如何做到這一點,所以我認爲你可以通過用一些替代方法替換'Tag.find()'獲得很大的收益更新方法。如果您使用的是Rails 3,我的理解是AREL將這些東西鏈接在一起以執行儘可能少的查詢。 – Andrew 2011-02-24 20:28:02

+1

但是你應該只需要一個SQL查詢就能做到這一點:「更新'標籤'設置'流行'='流行度'+ 1哪裏'id' = X」 - 我在這裏丟失了什麼? – krn 2011-02-24 20:32:03

回答

25
Tag.increment_counter :popularity, id 

這不僅跳過了選擇,而且它增加了原子性。

+1

不知道那個!謝謝! – christianblais 2011-02-24 20:41:47

+2

如果您要更改超過1,請參閱http://apidock.com/rails/ActiveRecord/CounterCache/update_counters – 2011-09-08 14:09:58

2

也許是這樣的:

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

或者

Tag.where(:id => id).update_all("popularity = popularity + 1")