1

我有一个帖子模型,它有很多评级,我想将每个帖子的平均评级数字存储在帖子评级数据库列中。我在帖子模型上有一个计数器缓存,用于计算评分的数量。

我的 post.rb 中有以下代码

def update_rating
    if self.ratings_count_changed? 
      self.rating = self.ratings.average(:rating)
    end
  end

我把它作为 before_save 回调,所以每当编辑和保存帖子时,它都会更新评级,不是很有用。

有没有一种方法可以在创建新评级时调用此方法?

4

4 回答 4

1

您是否考虑将平均评分存储在评分模型中而不是后模型中?在这种情况下,您不需要任何回调,并且您需要在更改后的第一次请求中重新计算平均值。

于 2012-08-23T13:46:22.850 回答
1

不是在帖子上保存 before_save,而是在评级上执行 after_create,因为听起来您需要在创建新评级时更新该评级分数,而不是在保存帖子之前。

于 2012-08-23T13:52:33.303 回答
1

接近目标的一种方法是after_create向模型添加回调Rating

class Rating < ActiveRecord::Base
  belongs_to :post

  # ...

  after_create :update_post_average_rating
  def update_post_average_rating
    self.post.update_attributes(:rating => self.post.ratings.average(:rating))
  end
end

甚至更 OO 友好的版本:

class Post < ActiveRecord::Base
  has_many :ratings

  # ...

  def update_average_rating
    update_attributes(:rating => self.ratings.average(:rating))
  end
end

class Rating < ActiveRecord::Base
  belongs_to :post

  # ...

  after_create :update_post_average_rating
  def update_post_average_rating
    self.post.update_average_rating
  end
end
于 2012-08-23T13:52:53.473 回答
1

如何将其放入评级模型:

after_create :update_post_average_rating

def update_post_average_rating
  self.post.rating = #....
end
于 2012-08-23T13:53:29.183 回答