_changed?метод при использовании counter_cache - PullRequest
1 голос
/ 11 марта 2012

Мне нужно обновить атрибут: Average_rate при добавлении нового комментария.У меня есть в comments.rb

  belongs_to :page, :counter_cache => true

и в page.rb

  has_many :comments
  after_save :update_average_rate

и метод update_average_rate в page.rb

  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 изменяется.Что я делаю не так?Заранее спасибо

1 Ответ

1 голос
/ 11 марта 2012

Ваша проблема в том, что обновления счетчика на самом деле не устанавливают "измененные" флаги в true.

Для столбца / атрибута a, a_changed? будет истинным, если и только если a было изменено, но не сохранено в базе данных. Основное поведение выглядит так :

  1. Загрузить или создать o. o.a_changed? будет ложным.
  2. o.a = pancakes, o.a_changed? будет истинным.
  3. o.save, o.a_changed? будет ложным.

Вы используете :counter_cache, но внутри, который использует update_counters и это:

просто выполняет прямое обновление SQL для записи с заданным идентификатором, изменяя заданный хэш счетчиков на величину, заданную соответствующим значением

Таким образом, после вызова update_counters атрибут счетчика не будет помечен как измененный , так как значение счетчика в базе данных будет новым.

Я думаю, что вам придется переместить вашу average_rate логику в after_save обратный вызов в комментариях.

...