2013-01-24 2 views
1

내가 이해할 수없는 것을 발견했습니다. 주어진 다음의 :ActiveRecord : has_many 관계의 개체 수

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 
... 

를이 위의 자식을 쿼리에 포함하더라도 각 부모에 대한 쿼리가 생성됩니다.

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

그리고 아이들의 클래스를 가져 오는 경우는 "배열"나에게 알려주기 때문에 즉, 이상하다 :

>>> parent.children.class 
Array 

내가 체크하면 무엇을 수정하는 것은 내가 어린이 .to_a를 호출하는 경우입니다 "to_a"의 호출 후에 클래스는 다시 배열을가집니다.

>>> parent.children.to_a.class 
Array 

왜 수법이 다릅니 까?

답변

1

.count 대신 .size를 사용해보십시오. ActiveRecord는 이미 가져온 콜렉션의 크기를 결정하기보다는 SQL 수를 계산합니다.

관련 문제