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



我有一个Post模型,它有很多评级,我想把每个帖子的平均评级数据存储在Post ratings db列中。我在帖子模型上有一个计数器缓存,它统计评分的数量。

我的post.rb 中有以下代码

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

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

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

接近目标的一种方法是将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

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

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

如何将其放入评级模型:

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

相关内容

  • 没有找到相关文章

最新更新