2011-08-11 4 views
0

미션, 사용자 및 위트가있는 모델이 있습니다. 지혜는 임무와 사용자에게 속합니다.레일로드, 포함 및 세션 속성

특정 사용자에 대한 모든 임무 및 열의 부하 목록을로드하고 싶습니다. LEFT OUTER JOIN을 수행하고 조인에 조건을 추가해야합니다.

Mission.joins("LEFT OUTER JOIN wits ON wits.mission_id = missions.id AND wits.user_id = #{current_user.id}") 

그런 다음 내 목록에 내가 올바른 사용자에 속하는 지혜를 얻을 수 mission.wits.first을 수행 할 수 있습니다 여기에 지금 노력하고 있습니다 것입니다.

매우 친절한 레일이 아니며, .loaded를 확인해야합니다. 조건이 충족되지 않으면 모든 재치가로드되지 않도록 속성.

더 좋은 방법이 있습니까? 범위를 사용하여 작업을 완료 하시겠습니까? 어쩌면 Mission에 새로운 가상 속성을 추가 할 수도 있지만, 각 목록에서 데이터베이스를 20 번 호출하는 것을 피하고 싶습니다.

업데이트 : 결국 나는 mission_list와 각 mission마다 current_user에 대한 위트 상태를보고 싶습니다. acts_as_api라는 JSON에서 내 목록보기를 만드는 데 사용하는 보석을 사용하고 있습니다.하지만 모델 내부의 세션 변수에 액세스 할 수 없기 때문에 필요한 모든 것을로드하려면이 열망하는로드하는 물건을보고있는 것입니다. 컨트롤러에서. 이 당신을 위해 작동합니다

답변

0

당신이 때를 미션에서 쿼리있는 이유가 있나요 당신이 정말로 순발력을 원한 것 같은데요? 또한 관련 임무 목록을 원할 경우 이와 비슷한 작업을 수행 할 수도 있습니다.

Wit.includes(:mission).where(:user_id => params[:user_id]).select(&:mission).uniq 
+0

아니요. 실제로는 선교사 명단을 원합니다. 각각의 임무는 위트가 관련이 있는지 없는지를 나타내며, 쿼리가 있으면 상태를 나타냅니다. – rnaud

0

도와

감사 :

Wit.includes(:mission).where(:user_id => params[:user_id]) 

그런 짓을하지 왜

Mission.joins(:wits).where(:wits => { :user_id => params[:user_id] }) Or 
Mission.joins(:wits).where('wits.user_id' => params[:user_id]) 
+0

아니요. 이는 위트가있는 임무 만 표시합니다. 내가 사용한 쿼리에는 WHERE 조건 대신 AND가 포함되어 있습니다. (예 : http://searchoracle.techtarget.com/answer/LEFT-OUTER-JOIN-with-ON-condition-or-WHERE-condition) – rnaud