1

理解できないことに気がつきました。以下を考えると:

class Parent < ActiveRecord::Base
  has_many :children
end

Class Child < ActiveRecord::Base
  belongs_to :parent
end

ここで、すべての親をフェッチして、それぞれの親が何人の子供を持っているか知りたいとしましょう。次のようにします。

>>> Parent.all(:include => :children).each { |parent| print parent.children.count }
Parent Load ...
Child Load ...
...
(0.2ms)  SELECT COUNT(*) FROM "children" WHERE "children"."parent_id" = 46
...

上記のように子をクエリに含めても、親ごとにクエリが生成されます。子に対して .to_a を呼び出すと、修正されるのは次のとおりです。

>>> Parent.all(:include => :children).each { |parent| print parent.children.to_a.count }

これは奇妙です。子のクラスを取得すると、「配列」と表示されるからです。

>>> parent.children.class
Array

そして、「to_a」の呼び出し後にクラスをチェックすると、再び配列があります

>>> parent.children.to_a.class
Array

カウントの演技はなぜこんなに違うのですか?

4

1 に答える 1

1

.count の代わりに .size を試してください。ActiveRecord は、すでに取得したコレクションのサイズを決定するのではなく、SQL カウントを行います。

于 2013-01-24T19:00:05.437 に答える