1

쿼리 구문을 가져 오는 데 문제가 있습니다.활성 레코드 포함 위치 포함

블로그에 '카테고리'와 같은 기능을하는 채널이 있습니다. 나에게는 게시물과 같은 프로그램이 있습니다. 쇼에는 '승인 됨'이라는 부울이 있으므로 true 또는 false입니다. 채널에는 또한 위치가 있습니다 .. 채널에는 많은 프로그램이 있습니다.

내가 승인 한 쇼만으로 위치 순서대로 모든 채널을 얻으려면 어떻게해야합니까?

나는이 시도 : Channel.includes(:shows).order('channels.position')을하고 올바른 위치에 나에게 채널을 가져오고 이미 channel.shows을 할 수 있지만, 그것은 여부에 관계없이 show.approved=true의 해당 채널에 할당 된 모든 프로그램을 얻고있다.

Channel.includes(:shows).order('channels.position')은 쇼가 승인되었는지 여부에 관계없이 모든 채널과 쇼를 반환합니다.

Channel.includes(:shows).where(shows:{approved: true}).order('channels.position')은 승인 된 콘텐츠가없는 채널은 건너 뛰고 승인 된 채널 만 반환합니다. 하지만 쇼의 상태와 관계없이 반환 할 채널이 필요하지만 쇼는 빈 배열이어야합니다.

+0

당신은 외부 조인을 사용해야합니다. 이 SO 링크를 확인하십시오 : http://stackoverflow.com/questions/1509692/rails-activerecord-joins-with-left-join-instead-of-inner-join – mcfinnigan

+0

이렇게 하시겠습니까? '채널 .includes (: shows) .where (: shows => []). 주문 ('channels.position')' – depa

답변

1

내가 개인적으로 루비를 사용하십시오 (여전히 SQL에 선명하게 필요) :

channels = Channel.includes(:shows).order('channels.position') 

channels.each { |c| c.shows.keep_if(&:approved?) } 
+0

허. 더 이상 쿼리 오버 헤드가 발생하지 않습니까? 내가 루비 초보자로서 실행 한 문제의 한 부분은 기본 Model.all을 사용하여 너무 많은 쿼리를 보내고 있으며 내가하고있는 일을 정리/속도를 높이려고한다는 것입니다. – grimmwerks

+0

나는 당신이 확신하는 것처럼 로그를 모니터하는 것이 좋습니다. 'Channel.includes (: shows)'가 너무 많은 쿼리를 생성한다면,'Channel.all'과'Show.all'을 사용하여 원하는 구조를 만들 수 있습니다. –

+0

궁금한 점 : railscast를보고있는 중 : http://railscasts.com/episodes/215-advanced-queries-in-rails-3?view=asciicast 쇼를 가져 오는 범위를 가질 수 없습니까? 승인 되었습니까? 병합합니까? – grimmwerks

관련 문제