创建新评级时更新帖子属性

时间:2012-08-23 13:40:30

标签: ruby-on-rails ruby model update-attributes

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

我在post.rb中有以下代码

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

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

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

4 个答案:

答案 0 :(得分:1)

您是否考虑将平均评级存储在评级模型中而不是发布模型?在这种情况下,您不需要任何回调,并且您需要在更改后首先请求重新计算。

答案 1 :(得分:1)

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

答案 2 :(得分: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

答案 3 :(得分:1)

如何将其纳入评级模型:

after_create :update_post_average_rating

def update_post_average_rating
  self.post.rating = #....
end