カテゴリー:
Rails
タグ:
 Rails counter_cache

このエントリーをはてなブックマークに追加
更新日時:
2016年12月07日(水)
作成日時:
2016年12月07日(水)

前の記事 / 次の記事

やはり世の中にはどこかに同じことを考えている人がいるようで。
再開発しなくて済んだ。

参考:Rails4 ActiveRecordでatomicなSQLでincrementするハック

インクリメント、デクリメントするメソッドっていうのはもちろん
Rails様においてはちゃんと用意されていて、次のようなメソッドがあるのだけど、

Railsのupdate_columnsとupdate_countersのまとめ

このハックのポイントはupdated_atも同時に更新できるところ。
ロシアンドールなキャッシュを構成する上では更新日時が変更されるのって重要な
ポイントだと思うんだけど、Rails的にはカウンターキャッシュ使うならそもそも
キャッシュ使わなくていいんじゃねーの?っていう考えなのでしょうか。

以下上記参考ページから引用

module ActiveRecord
  class Base
    def increment_atomic!(attribute, by = 1, touch = true)
      operator = by < 0 ? '-' : '+'
      quoted_column = self.class.connection.quote_column_name(attribute)
      updates = ["#{quoted_column} = COALESCE(#{quoted_column}, 0) #{operator} #{by.abs}"]
      updates << "#{self.class.connection.quote_column_name(:updated_at)} = now()" if touch
      self.class.unscoped.where(self.class.primary_key => id).update_all updates.join(', ')
      reload
    end
  end
end