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。

对于 column/attribute aa_changed?当且仅当a已更改但未保存到数据库时才为真。基本行为是这样的

  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评论的回调中。

于 2012-03-11T19:04:59.483 回答