2012-03-11 5 views
1

새로운 코멘트가 추가되면 속성 : average_rate를 업데이트해야합니다. 나는 page.rb_changed? method 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 방법이 있지만이 작업을 나던. 내가하고있는 동안 update_average_rate 메서드에서

raise comments_count_changed?.inspect 

을 출력하면 "false"를 출력하지만 comments_count는 변경됩니다. 내가 뭘 잘못하고 있니? 미리 감사드립니다.

+0

': before_save' 후크를 사용해보십시오. –

+0

시도, 동일한 결과 ( – Pavel

답변

1

문제는 카운터 업데이트가 실제로 "changed"플래그를 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?은 거짓입니다. 당신은 :counter_cache하지만 내부적으로 사용하고

, 즉 update_counters하고를 사용

는 단순히 양에 의해 카운터 주어진 해시를 변경, 지정된 ID와 기록에 대한 직접 SQL 업데이트를 제공 않는다 update_counters 뒤에도

호출되어 해당 값에 의해, 카운터 특성 으로 표시되지는 데이터베이스 줘야의 카운터 값을 변경 나는 새로운 사람이다.

average_rate 로직을 댓글의 after_save 콜백으로 옮겨야한다고 생각합니다.