2012-03-03 2 views
1

동적 조건을 사용하여 열정적 부하를 실행할 수 있습니까? 더 구체적으로 : 오히려 단지 :items보다 전체 쿼리에 where 조건을 적용하지만, 달성 할 수있는 방법이 있으므로역동적 인 조건을 가진 열렬한 부하

u_id = params[:user_id] 
Container.includes(:items).where("items.user_id =?", u_id) 

이것은 분명히 나에게 어떤 user_id의 항목 그러나 모든 컨테이너를 제공하지 않습니다 이것은 ARel을 사용하거나 사용자 정의 SQL 쿼리가 필요합니까?

답변

0

그냥 쿼리에 scoped 전화 :

Container.where("items.user_id =?", u_id).includes(:items).scoped 

이것은 데이터베이스 쿼리보다는 Arel 객체를 반환합니다.

Rails Console에서 시험해보고 scoped없이 실행할 때와 비교하여 작성된 Arel 개체를 볼 수 있습니다.

+0

이렇게하면 범위를 더 잘 이해할 수 있습니다. 지금 쿼리는 항목이 포함 된 컨테이너 만 반환합니다. 특정 사용자에 대한 열망있는로드 항목을 사용할 수 있으며 모든 항목을 포함하지 않더라도 모든 컨테이너를 가져올 수 있습니까? – Stefan

+0

컨테이너에 user_id가 있다면 비교적 쉽습니다. Container.where ("user_id =?", params [: user.id]) .include (: items) .scoped' 이것은 주어진 사용자에 대한 모든 컨테이너를 선택한 다음 선택한 컨테이너와 관련된 항목을 포함합니다. 컨테이너에'user_id'가 없으면 내 머리 꼭대기에 대답이 없습니다. 내가 더 이상 찾을 것이 있으면 나는 그것을 게시 할 것이다. – nmott

+0

도움에 감사드립니다. 나는 디자인을 수정하려고 노력할 것입니다. 아마도 그것은 저의 어려움을 일으키는 원인 일 것입니다. 현재 모든 '사용자'는 모든 컨테이너를 가져올 수 있지만 컨테이너의 '항목'만 가져올 수 있습니다. 보기에서 약간의 논리로 작업 할 수 있지만 N + 1 쿼리 문제가 발생합니다. – Stefan

관련 문제