2017-02-28 1 views
0

문제가 생겼습니다. 전에는 만나지 못했지만 어디서나 온라인 솔루션을 찾을 수없는 것 같습니다. 기본적으로 동일한 사용자 테이블을 참조하는 invited_by_id 열을 포함하는 사용자 테이블이 있습니다.레일 - 자체 참조로 주문

지금 그러나 정말로 테이블의 양쪽 때문에

User 
.includes(:invited_by) 
.order("users.name ASC") 

작동하지 않습니다 여기 정렬 일반적인 액티브 레코드를 사용하여, 그것은 초대 사용자 이름을 기준으로 결과를 정렬하는 쿼리를 만들려고 해요 질문은 동일한 것이고, 레일스가 초대 한 것으로, 초대 된 _by가 아닙니다.

협회에서 주문하고 싶은 방법이 있습니까?

내가 활성 기록 믹스 인이를 사용하는 것을 시도하고있다, 그래서 기본 클래스에 직접 호출되지 않고,이 혼합 같은 기존 범위에서 작동 할 필요가

추가 정보 메서드가 범위에서 호출됩니다. 예컨대 여기

User 
.includes(:invited_by) 
.where(where_clause) 
.sort(:invited_by_name, :asc) 

들어 sort 방법은 믹스 인에 의해 제공되고,이 테이블을 구별 할 수 있어야하는 곳이다. 나는 그것이 관계가 무엇인지를 아는 것을 의미하는 논리를 가지고있어서, :invited_by_name이 : invited_by 관계의 이름란임을 알고있다. 그러나 그것은 내가 가진 것까지이다.

답변

0

다른 테이블과 동일한 테이블을 참조해야합니다. Arel로이 작업을 수행 할 수 있습니다

guest = Arel::Table.new(:users, :as => 'guest') 
inviter = Arel::Table.new(:users, :as => 'inviter') 

relation = guest. 
    project(Arel.sql('*')). 
    join(inviter).on(guest[:invited_by_id].eq(inviter[:id])). 
    order(inviter[:name]) 

@users = relation.to_sql 
+0

기존 범위에서 작동합니까? 이 작업이 수행 될 곳은 믹싱 된 내부입니다. 따라서 사용자 모델이 아닌 기존 범위로 작업해야합니다. – PaReeOhNos

+0

허, 아니요, 작동하지 않거나 시도하는 방법을 상상할 수 없습니다. Arel을 범위로 봤는데 쓸모있는 것을 못 보았습니다. 변경된 Arel 노드에 대한이 블로그 항목이 있지만 나는 당신에게 얼마나 도움이 될지 확신하지 못합니다 ... https://www.viget.com/articles/composable-sql-queries-in-rails-using-arel – SteveTurczyn

+0

흠 그게 내 문제 야 : (계속 파고 갈거야. – PaReeOhNos