使用活动记录回调来更新模型属性

时间:2012-04-18 20:12:31

标签: ruby-on-rails ruby-on-rails-3 activerecord

假设我有一个处理PostsComments的Rails应用。发布帖子has_many评论和每条评论belongs_to发帖。

每条评论都有word_count property。 Post对象具有average_comment_word_count属性,该属性是每个Comment word_count的平均值。

当我针对特定评论发送DELETE请求时,应用应重新计算average_comment_word_count参数。我认为它的工作方式是这样的:

class Comment < ActiveRecord::Base

belongs_to :user
belongs_to :post
after_destroy :update_post_average_word_count

def update_post_average_word_count
  post_average_word_count = 0
  post.comments.each do |comment|
     post_average_word_count = post_average_word_count + comment.word_count
  end

  post_average_word_count / post.comments.count
  post.update_attributes average_word_count: post_average_word_count
end

但是我收到了数据库错误,因为该应用无法找到对相关帖子的引用(因为评论已经消失,提示Homer Simpson在这里)

是否有不同的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

使用before_destroy并在计算post_average_word_count时考虑到这一点:

post.update_attributes average_word_count: (post_average_word_count - self.word_count)