_changed?使用counter_cache时的方法

时间:2012-03-11 15:23:20

标签: ruby-on-rails ruby counter-cache

我需要在添加新评论时更新属性:average_rate。 我有评论.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被更改。我做错了什么?提前致谢

1 个答案:

答案 0 :(得分:1)

您的问题是计数器更新实际上并未将“已更改”标志设置为true。

对于列/属性a,当且仅当a_changed?已更改但未保存到数据库时,a才为真。 The basic behavior goes like this

  1. 加载或创建oo.a_changed?将是假的。
  2. o.a = pancakeso.a_changed?将是真的。
  3. o.saveo.a_changed?将是假的。
  4. 您正在使用:counter_cache但在内部使用update_counters并且:

      

    只是对具有给定ID的记录执行直接SQL更新,使用相应值给出的量更改计数器的给定哈希值

    因此,在调用update_counters之后,计数器属性将不会被标记为已更改,因为数据库中的计数器值将是新的。

    我认为您必须将average_rate逻辑转移到评论的after_save回调中。