2012-07-16 76 views
31

我有一個圖片模型,其中包含一個視圖計數(整數)的變量。 每次有人查看圖片對象時,查看計數都會加1。。增量vs + = 1

在完成這一操作,是什麼

@picture.view_count += 1 
    @picture.save 

@picture.increment(:view_count, by = 1) 

另外,如果我使用的增量,是.save必要區別?

+1

應該不是語法是'@ picture.increment(:VIEW_COUNT,1)'? – 2013-04-10 14:03:16

+0

注意併發性!在這種情況下,您的兩種解決方案都不安全!想象一下,兩個用戶同時運行代碼。兩者都使用相同的'view_count'值。然後第二個用戶在保存時覆蓋第一個用戶的值,最終計數比預期的少一個。 你應該使用'increment_counter'來避免這種情況。 – 2016-10-19 10:39:29

回答

45

increment的來源位於下方,如果nil將屬性初始化爲零並添加通過的值(默認值爲1),則不會保存,因此.save仍然是必需的。

def increment(attribute, by = 1) 
    self[attribute] ||= 0 
    self[attribute] += by 
    self 
end 
+24

或者你可以使用'increment!'方法,如果你不想手動保存 – 2012-07-16 06:40:19

+2

這是有點過時了,新方法是increment_counter – timroman 2014-06-28 04:00:52

+0

你認爲這個增量的東西可以與關係範圍?發佈has_many圖像,圖像模型具有需要遞增的位置屬性 – Ben 2014-12-06 15:33:54

4

您應該使用counter_cache。 counter_cache幫助你自動增加記錄數量。

class Picture < ActiveRecord::Base 
    has_many :views 
end 

class View < ActiveRecord::Base 
    belongs_to :picture, counter_cache: true 
end 

圖片表需要柱名views_count,或者您可以使用自己的名字此列,例如:

belongs_to :picture, counter_cache: :number_of_views 

但我建議你使用默認名稱counter_cache列是views_count 。

+0

that' d需要一個模型,因此一個表?或者它可能被「抽象」? – Ben 2014-12-06 15:34:19

20

在這種情況下,我經常使用counter_cacheincrement_counter

這樣的:

Picture.increment_counter(:view_count, @picture.id) 

這種方式更簡單,比自制方法快。

順便說一句,ActiveRecord :: CounterCache也有decrement_counter

http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html

+2

這是最好的答案,因爲它考慮了併發性。 – 2016-10-19 10:40:30