我有一個圖片模型,其中包含一個視圖計數(整數)的變量。 每次有人查看圖片對象時,查看計數都會加1。。增量vs + = 1
在完成這一操作,是什麼
@picture.view_count += 1
@picture.save
和
@picture.increment(:view_count, by = 1)
另外,如果我使用的增量,是.save必要區別?
我有一個圖片模型,其中包含一個視圖計數(整數)的變量。 每次有人查看圖片對象時,查看計數都會加1。。增量vs + = 1
在完成這一操作,是什麼
@picture.view_count += 1
@picture.save
和
@picture.increment(:view_count, by = 1)
另外,如果我使用的增量,是.save必要區別?
increment
的來源位於下方,如果nil將屬性初始化爲零並添加通過的值(默認值爲1),則不會保存,因此.save
仍然是必需的。
def increment(attribute, by = 1)
self[attribute] ||= 0
self[attribute] += by
self
end
您應該使用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 。
that' d需要一個模型,因此一個表?或者它可能被「抽象」? – Ben 2014-12-06 15:34:19
在這種情況下,我經常使用counter_cache
和increment_counter
。
這樣的:
Picture.increment_counter(:view_count, @picture.id)
這種方式更簡單,比自制方法快。
順便說一句,ActiveRecord :: CounterCache也有decrement_counter
。
http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html
這是最好的答案,因爲它考慮了併發性。 – 2016-10-19 10:40:30
應該不是語法是'@ picture.increment(:VIEW_COUNT,1)'? – 2013-04-10 14:03:16
注意併發性!在這種情況下,您的兩種解決方案都不安全!想象一下,兩個用戶同時運行代碼。兩者都使用相同的'view_count'值。然後第二個用戶在保存時覆蓋第一個用戶的值,最終計數比預期的少一個。 你應該使用'increment_counter'來避免這種情況。 – 2016-10-19 10:39:29