如何根据另一个表向我的用户模型添加计数器总计?

时间:2012-04-12 23:14:35

标签: ruby-on-rails activerecord

我的用户有很多点和点属于用户。

积分可以是任何金额。

我希望通过向我的用户模型添加总点缓存来对我的数据库表示友好,这样我就可以轻松地执行user.total_points

我该如何实施呢?

编辑:PS我是第一次添加积分,所以没有必要回去计算用户可能已经获得的积分......只需要它继续前进

1 个答案:

答案 0 :(得分:1)

如果counter_cache表中的行构成一个点,则可以使用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