1

新しいコメントが追加されたら、属性:average_rateを更新する必要があります。私はcomments.rbにあります

  belongs_to :page, :counter_cache => true

およびpage.rb

  has_many :comments
  after_save :update_average_rate

page.rbのupdate_average_rateメソッド

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

しかし、それは機能しません。私がしているとき

raise comments_count_changed?.inspect

update_average_rateメソッドでは、「false」を出力しますが、comments_countが変更されます。私が間違っていることは何ですか?前もって感謝します

4

1 に答える 1

1

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

列/属性aの場合、変更されたがデータベースに保存されていないa_changed?場合にのみtrueになります。基本的な動作は次のようになりますa

  1. ロードまたは作成しますoo.a_changed?falseになります。
  2. o.a = pancakeso.a_changed?trueになります。
  3. o.saveo.a_changed?falseになります。

あなたは使用しています:counter_cacheが、内部的には、それを使用update_countersしています。

指定されたIDを持つレコードのSQLを直接更新し、指定されたカウンターのハッシュを対応する値で指定された量だけ変更します。

したがって、呼び出された後は、データベース内のカウンター値が新しいものになるため、カウンター属性は変更update_counters済みとしてマークされません。

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

于 2012-03-11T19:04:59.483 に答える