2012-03-11 35 views
1

新しいコメントが追加されると、属性:average_rateを更新する必要があります。 は私がpage.rb_changed?メソッドcounter_cacheを使用する場合

def update_average_rate(comment) 
    if comments_count_changed? 
     write_attribute :average_rate, (comments.sum(:rate)/comments.count.to_f).ceil 
    end 
    end 

にcomments.rb

belongs_to :page, :counter_cache => true 

にし、page.rb

has_many :comments 
    after_save :update_average_rate 

とupdate_average_rate方法を持っているが、それは仕事をdoesntの。私が行っているときには、update_average_rateメソッドで

raise comments_count_changed?.inspect 

が出力されますが、comments_countが変更されます。私が間違っていることは何ですか?事前に感謝します

+0

':before_save'フックを試してください。 –

+0

試行しましたが、同じ結果( – Pavel

答えて

1

あなたの問題は、カウンターの更新は実際には "変更"フラグをtrueに設定しないということです。

列/属性aの場合、aが変更されたがデータベースに保存されていない場合にのみ、a_changed?が真となります。 The basic behavior goes like this

  1. oをロードまたは作成します。 o.a_changed?は偽になります。
  2. o.a = pancakes,o.a_changed?となります。
  3. o.save,o.a_changed?はfalseになります。

あなたはupdate_countersて、それを使用すること、内部:counter_cacheを使用しますがいる:

は、単に与えられた量だけカウンタの与えられたハッシュ値を変更すること、与えられたIDを持つレコードの直接SQLの更新を行いますupdate_countersが呼び出された後がデータベースウィルのカウンタ値としてを変更して対応する値

により、カウンタ属性がマークされることはありません私は新しい人です。

average_rateロジックをafter_saveコメントのコールバックに移動する必要があると思います。

関連する問題