好的,这是这个问题的后续问题:Is overriding an ActiveRecord relation's count() method okay?基本上我有一个我要分页的关系,并且计算它很慢,所以我用缓存覆盖count()
计数器属性。
我有:
class CountDelegator < SimpleDelegator
def initialize(obj, total_count)
super(obj)
@total_count = total_count
end
def count
@total_count
end
end
class Parent
has_many :kids do
def chatty_with_singleton
resultset = where(:chatty => true)
def resultset.count
proxy_association.owner.chatty_kids_count
end
resultset
end
def chatty_with_delegation
resultset = where(:chatty => true)
CountDelegator.new(resultset, proxy_association.owner.chatty_kids_count)
end
end
end
p = Parent.first
现在,当我执行p.kids.chatty_with_singleton.count
或p.kids.chatty_with_delegation.count
时,我会使用缓存计数。大!但是,以下情况有所不同:
# Uses the cached count
p.kids.chatty_with_singleton(:order => "id desc").count
# Does not use the cached count
p.kids.chatty_with_delegation(:order => "id desc").count
我完全糊涂了 - 我不知道为什么这两种情况在实践中会有不同的表现。 (是的,我知道p.kids.chatty_with_singleton(:id => 0).count
返回了错误的值,我对此感到满意。)
为什么在单例结果集上定义方法会导致该定义占主导地位,而委托人却不支配?
答案 0 :(得分:0)
您正在重新实施belongs_to
提供的内置counter_cache
选项。如果您没有使用rails默认列,则只需指定缓存列。
使用counter_cache
会自动读取表格中的缓存值,而不是执行COUNT
。