2012-08-09 2 views
2

Rails 응용 프로그램에서 한 테이블을 다른 테이블의 명명 된 범위로 조인하려고합니다. 내 조인 문의 순수한 SQL에서 명명 된 범위를 다시 작성하지 않고이 작업을 수행 할 수있는 방법이 있습니까?명명 된 범위를 Rails에서 서브 쿼리로 사용

기본적으로 이와 같은 방법이 있습니까?

가 Bar.joins는 다음과 같은 SQL 생성
class Foo < ActiveRecord::Base 
    scope :updated_today, where('updated_at > ?', DateTime.now.prev_day) 
end 

Bar.joins(Foo.updated_today) 

:

SELECT * FROM bars 
INNER JOIN 
    (SELECT * FROM foos WHERE updated_at > 2012-8-9) AS t0 
ON bar_id = bars.id 

답변

1

나는이를 위해 특별히 고안된 방법이 있다고 생각하지 않습니다. 당신은, 그러나, 당신은 다음과 같이, 조인 문에서 하위 쿼리로 사용할 수있는 문자열로 범위의 전체 SQL 쿼리를 얻을 수 ActiveRecord::Relationto_sql 방법을 사용할 수 있습니다 : 정말 재미있는

Bar.joins("INNER JOIN (#{Foo.updated_today.to_sql}) as t0 ON bar_id = bars.id") 
+0

예, 저는 제 질문에 대답했습니다. 누구든지이 일을하는 더 좋은 방법이 있다면 언제든지 전화 해주십시오. – Ajedi32

+1

특히 남은 사람들이 그렇게 할 수 없을 때 자신의 질문에 완벽하게 대답 할 수 있습니다. :) – BaronVonBraun

2

당신은 다른 모델의 쿼리에 범위를 결합하기 위하여 merge 방법을 사용할 수 있습니다이 :

Bar.joins(:foos).merge(Foo.updated_today) 

내가 본하지 않은 (레일스 API는 메소드 자체에 대한 문서조차 없다.) 여기에 꽤 괜찮은 blog post이있다.

또한 RailsCast에 Advanced Queries in Rails 3에 언급되어있는 것으로 나타났습니다.

+1

을, 그러나 그것은 제가 찾고 있던 것이 아닙니다. 내가 쿼리에 범위를 조인하고 싶지 않아요, 내가 LEFT OUTER JOIN을 호출 할 수있는 하위 쿼리로 범위에 의해 생성 된 쿼리를 사용하고 싶습니다. (이 질문을 좀 더 명확히하기 위해 업데이트 할 예정입니다.) – Ajedi32

관련 문제