2014-12-19 2 views
0

Ok 그래서 두 모델 User 및 Following을 만들었습니다. 사용자가 사용자 이름 속성을 갖고 다음 사용자가 user_id, following_user_id와 같은 2 개의 속성을 가지고 있습니다. 나는 각각의 모델에서 이러한 연관성을 설정했으며 모든 것은 훌륭하게 작동한다.Rails ActiveRecord 사용자 지정 명명 된 연결로 주문하는 방법

class User < ActiveRecord::Base 
    has_many :followings, dependent: :destroy 
    has_many :followers, :class_name => 'Following', :foreign_key => 'following_user_id', dependent: :destroy 
end 

class Following < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :following_user, :class_name => 'User', :foreign_key => 'following_user_id' 
end 

이제 사용자 이름으로 ActiveRecord 쿼리를 수행 할 때 결과를 주문해야합니다.

Following.where(:user_id => 47).includes(:user).order("users.username ASC") 

문제는 내가있다 : 나는 USER_ID 나에 속하는 협회의 이름으로 명령 다음의 목록을 반환합니다 다음 코드로 바로 접속 사용자 협회 (USER_ID)에 대해 쉽게 달성 할 수 다른 협회 (following_user_id)의 주문에 대해 동일한 결과를 얻을 수 없습니다. .includes 전화에 나는 연결을 추가했지만 액티브 레코드는 이름에 .order 호출에 협회 이름을 변경 내가 시도라는 제목의 following_users

Following.where(:user_id => 47).includes(:user => :followers).order("following_users.username ASC") 

테이블에 협회를 찾고 있기 때문에 오류가 발생합니다 I 추종자로서 사용자 모델에서 설정하지만 다음 작업은 없지만 작업 제목은 여전히 ​​해당 제목이있는 표를 찾고 있습니다. 나는 또한 user.username을 시도했지만 첫 번째 예제에서와 같이 다른 연결을 기반으로 주문할 것입니다.

어떻게하면 ActiveRecord 결과를 following_user.username으로 주문할 수 있습니까?

답변

2

SQL 쿼리에 following_users 테이블이 없기 때문입니다. 수동과 같이 그것을 가입해야합니다

:

Following. 
joins(" 
    INNER JOIN users AS following_users ON 
    following_users.id = followings.following_user_id 
"). 
where(user_id: 47). # use "followings.user_id" if necessary 
includes(user: :followers). 
order("following_users.username ASC") 

following_user_id이 단순히 OUTER JOIN를 사용하지 않는 Following 행을 가져올 수. 그냥 참고로

Following. 
where(user_id: 47). # use "followings.user_id" if necessary 
includes(:following_user, {user: :followers}). 
sort_by{ |f| f.following_user.try(:username).to_s } 

:

다른 방법으로, 속도와 메모리 비용을 줄 수있는 경우에 당신은, 오히려 SQL보다 루비에서이 작업을 수행 할 수 있습니다 try 누락 following_user의 경우되어 있고 to_s은이다 정렬을 위해 문자열을 비교해야합니다. 그렇지 않은 경우 nilString을 비교하면 충돌이 발생합니다.

+0

매력처럼 작동합니다! 고맙습니다! –

관련 문제