为什么单例方法和委托方法的行为不同?

时间:2017-10-30 17:30:18

标签: ruby-on-rails ruby activerecord

好的,这是这个问题的后续问题: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.countp.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返回了错误的值,我对此感到满意。)

为什么在单例结果集上定义方法会导致该定义占主导地位,而委托人却不支配?

1 个答案:

答案 0 :(得分:0)

您正在重新实施belongs_to提供的内置counter_cache选项。如果您没有使用rails默认列,则只需指定缓存列。

使用counter_cache会自动读取表格中的缓存值,而不是执行COUNT