我需要在添加新评论时更新属性: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被更改。我做错了什么?提前致谢
答案 0 :(得分:1)
您的问题是计数器更新实际上并未将“已更改”标志设置为true。
对于列/属性a
,当且仅当a_changed?
已更改但未保存到数据库时,a
才为真。 The basic behavior goes like this:
o
。 o.a_changed?
将是假的。o.a = pancakes
,o.a_changed?
将是真的。o.save
,o.a_changed?
将是假的。您正在使用:counter_cache
但在内部使用update_counters
并且:
只是对具有给定ID的记录执行直接SQL更新,使用相应值给出的量更改计数器的给定哈希值
因此,在调用update_counters
之后,计数器属性将不会被标记为已更改,因为数据库中的计数器值将是新的。
我认为您必须将average_rate
逻辑转移到评论的after_save
回调中。