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

目標に近づく 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 に答える