2012-04-18 14 views
2

PostsCommentsを扱うRailsアプリケーションがあるとします。 A投稿has_manyコメントと各コメントbelongs_to投稿。アクティブなレコードコールバックを使用してモデル属性を更新する

各コメントはword_count propertyです。投稿オブジェクトには、コメントのword_countのそれぞれの平均であるaverage_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 

これを達成する別の方法はありますか?

答えて

2

使用before_destroyとpost_average_word_countを計算するときに、このことを考慮:

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

+0

私が使用している場合は、 'before_destroy'私は平均を計算するときに破壊されるコメントを除外する必要がありませんでしょうか? –

+0

はい、そうです。 'post.update_attributes average_word_count:(post_average_word_count - self.word_count)' – DanS

+0

オブジェクトが破壊された後にオブジェクトの「所有者」を保存する方法はありませんか?私はすでに 'Comment'で書かれたメソッドを持っていて、メソッドの重複を避けたい(またはすべてのコードを' Post'に移動させたい) –

関連する問題