私はビュー数(整数)の変数を含むピクチャモデルを持っています。 誰かがピクチャオブジェクトを見るたびに、ビューカウントが+1されます。これを行うになって .increment vs + = 1
、@picture.view_count += 1
@picture.save
と
私は増分を使用している場合、.SAVE必要であるにも@picture.increment(:view_count, by = 1)
の違いは何ですか?
私はビュー数(整数)の変数を含むピクチャモデルを持っています。 誰かがピクチャオブジェクトを見るたびに、ビューカウントが+1されます。これを行うになって .increment vs + = 1
、@picture.view_count += 1
@picture.save
と
私は増分を使用している場合、.SAVE必要であるにも@picture.increment(:view_count, by = 1)
の違いは何ですか?
ソースは、以下のとおりです.nilの場合は属性をゼロに初期化し、by(デフォルトは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
しかし、私はあなたがviews_countあるcounter_cache列のデフォルト名を使用することをお勧めします。
'モデルが必要なのでテーブルを必要としますか?それとも「抽象化」できますか? – Ben
この場合、よくcounter_cache
とincrement_counter
を使用します。このような
:
Picture.increment_counter(:view_count, @picture.id)
この方法では、より簡単で、自作の方法よりも高速です。
なお、ActiveRecord :: CounterCacheにはdecrement_counter
も含まれています。 (:VIEW_COUNT、1) `
http://api.rubyonrails.org/classes/ActiveRecord/CounterCache/ClassMethods.html
これは最良の答えです。なぜなら、これは同時性を扱うからです。 –
は、構文は' @のpicture.incrementではないでしょうか? –
並行性に注意してください!あなたの両方のソリューションはこの場合安全ではありません! 2人のユーザーが同時にコードを実行するとします。どちらも同じ 'view_count'値で動作します。次に、2番目のユーザーが保存時に最初のユーザーの値を上書きし、最終的なカウントが1未満になる。 これを避けるには、 'increment_counter'を使うべきです。 –