ビューカウント(整数)の変数を含むPictureモデルがあります。ビューカウントは、誰かがPictureオブジェクトを表示するたびに+1ずつ増加します。
これを行う上で、の違いは何ですか
@picture.view_count += 1
@picture.save
と
@picture.increment(:view_count, 1)
また、incrementを使用する場合、.saveは必要ですか?
ビューカウント(整数)の変数を含むPictureモデルがあります。ビューカウントは、誰かがPictureオブジェクトを表示するたびに+1ずつ増加します。
これを行う上で、の違いは何ですか
@picture.view_count += 1
@picture.save
と
@picture.increment(:view_count, 1)
また、incrementを使用する場合、.saveは必要ですか?
のソースincrement
は以下のとおりです。これは、nilの場合に属性をゼロに初期化し、渡された値(デフォルトは1)を追加しますが、保存は行わないため、.save
引き続き必要です。
def increment(attribute, by = 1)
self[attribute] ||= 0
self[attribute] += by
self
end
私はよく使用counter_cache
しますincrement_counter
が、その場合は。
このような:
Picture.increment_counter(:view_count, @picture.id)
この方法は、自作の方法よりも簡単で高速です。
ちなみに、ActiveRecord::CounterCacheにも。がありdecrement_counter
ます。
http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html
counter_cacheを使用する必要があります。counter_cacheは、レコード数を自動的にインクリメントするのに役立ちます。
class Picture < ActiveRecord::Base
has_many :views
end
class View < ActiveRecord::Base
belongs_to :picture, counter_cache: true
end
picturesテーブルにはviews_countという名前の列が必要です。または、この列に独自の名前を使用できます。次に例を示します。
belongs_to :picture, counter_cache: :number_of_views
ただし、counter_cache列のデフォルト名であるviews_countを使用することをお勧めします。