2013-03-29 4 views
1

정렬을 위해 부모 요소에 대한 특성을 사용하는 수많은 예제가 있지만 조부모에 대한 것은 없습니다. 거기에 또 다른 게시물이 자세히 설명되어 있다면, 나는 그것을 찾을 수 없습니다, 아마도 그 단어를 모르기 때문에. 나는 아이들의 목록을 제공하기 위해 노력하고있어, 그래서ActiveRecord 하위 쿼리, 조부모로 정렬

class GrandParent < ActiveRecord::Base 
    has_many :parents 
    has_many :children, through: :parents 
end 


class Parent < ActiveRecord::Base 
    belongs_to :grand_parent 
    has_many :children 
end 


class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

,하지만 난 그게 조부모으로 분류합니다 : 그래서, 여기 내 이론적 인 모델입니다.

나는 Child.joins(:grandparent).order('grandparent.name').all

처럼 쓸모없는 일을 시도했지만 그건 그냥 나를 위해 그 일을 아니에요. 나는 100 가지 다른 변종을 시도했지만, 그들 뒤에 많은 논리가 있다고 말할 수는 없다. ... 누구나 이것에 대해 좋은 생각을 갖고 있는가?

답변

2

당신은 그냥 확인

Child.joins(:parent => :grand_parent).order('grand_parents.name') 
+0

이것은 내가 찾고있는 것보다 더 기분이 좋습니다. 고맙습니다! 또한 모든 작업을 반복하는 것보다 훨씬 빠르게 작동합니다. 약 1 초 (이 방법)는 6000 개의 객체에 대해 17 초 (반복)입니다. – counterbeing

1

속도가 신경 쓰이지 않는다면 이해하기 쉬운 이러한 개체를 훨씬 더 명확하게 분류 할 수 있습니다. 특히,

children.sort_by{|child| child.grand_parent.name} 

그것은 전체 SQL을 사용하지 않을거야 당신이 children 많은 경우 큰되지 않습니다,하지만 때로는 구현의 용이성을 위해 최적화 가치가있다.

+0

시도 할 수 있고, 그 어떤 경우를 위해 잘 작동합니다. 나는이 데이터베이스에서 약 7000 명의 "손자"를 가지고있다. 가능하다면 좀 더 데이터베이스/activerecord 지향적 인 솔루션을보고 싶습니다. 약 6000 개의 결과를 반환하는 쿼리를 사용하면 약 20 초가 걸립니다. 그것은 Heroku의 제한 시간 한계에 가깝기 때문에 너무 길다. 내가 생각할 수있는 유일한 빠른 해결책은 조부모 이름을 부모 또는 자녀에게 복사하는 것입니다. 하지만 데이터베이스에 복제본을 작성하는 것은 잘못되었습니다. 감사! – counterbeing

+1

가능하면 활성 레코드로 작업 할 때 배열 (열거 가능) 정렬을 사용하지 않는 것이 가장 좋습니다! – spullen