0

多くのポイントを持っているユーザーがいて、ポイントはユーザーに属しています。

ポイントはいくらでも構いません。

user.total_points を簡単に実行できるように、ユーザーモデルに合計ポイントキャッシュを追加してデータベースに親切にしたい

これを実装するにはどうすればよいですか?

編集: PS 初めてポイントを追加するので、戻ってユーザーがすでに獲得したポイントを計算する必要はありません...今後必要になるだけです

4

1 に答える 1

1

テーブルcounter_cache内の行が 1 つのポイントを構成する場合、この手法を使用できます。pointsそれ以外の場合は、単純なafter_saveフィルターを使用して実装できます。

class User
  # add a column called total_points and set the default to 0    
  has_many :points    
end


class Point

  # assuming `amount` column stores the points.    
  belongs_to :user

  after_create { |p| p.update_user_points(:create) }
  after_update { |p| p.update_user_points(:update) if p.amount_changed? }
  after_destroy{ |p| p.update_user_points(:destroy)}

  def update_user_points(type)
    delta = (type == :create) ? amount :
               (type == :update) ? (amount - amount_was) :
                 -amount
    User.update_counters(user, :total_points => delta) 
  end

end
于 2012-04-12T23:30:18.887 に答える