これは、この質問のフォローアップの一種です。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
私は完全に混乱している - これらの2つの場合は実際には異なる動作をする理由私は知りません。 (はい、私はp.kids.chatty_with_singleton(:id => 0).count
が間違った値を返し、私はそれで大丈夫であることを認識しています)
シングルトンの結果セットでメソッドを定義すると、その定義が支配的になるのに対して、委譲者はなぜですか?
ちょうどそれを行う '.size'を使うことができます... – max
http://work.stevegrossi.com/2015/04/25/how-to-count-with-activerecord/ – max
これはありません'size()'と 'count()'の問題です。 'size()'と 'count()'の両方を委譲すると、 'p.chatty_kids_with_delegation.order(" id desc ")。size'はキャッシュされた属性を使うのではなく、COUNTクエリを実行します。 – Nate