2017-04-24 6 views
2

Arel 또는 ActiveRecord를 사용하여 Rails 5에서 교차 및 합집합을 사용하여 쿼리를 작성해야합니다. 지금까지 내가 찾은 SO에 대한 모든 대답은 일반적으로 OP가 다른 종류의 쿼리에 제공하는 특정 예제를 변형하는 것과 관련이있는 것으로 보입니다. 이 쿼리는 프로그래밍 방식으로 작성되고 있으며이를 수행하는 가장 현명한 방법은 INTERSECT 및 UNION과 조인 된 하위 쿼리입니다.Arel 또는 ActiveRecord를 사용하여 INTERSECT 및 UNION 쿼리를 프로그래밍 방식으로 작성하기

&으로 교차하고 |으로 결합하면 원하는 결과를 얻을 수 있습니다.하지만이 두 반환 배열을 사용하면 엄청나게 큰 거대한 데이터 세트를 메모리에 가져올 수 있습니다.

MyModel.where(...).intersect(MyModel.where(...)) 

작품의 이런 종류의,하지만 결과는 Arel::Nodes::Intersect보다는 유용하지 않은 ActiveRecord::Relation입니다. 나는 Arel을 직접 사용하여 이러한 시도를 시도했지만 Arel의 문서 부족으로 인해 좌절감을 나타 냈습니다.

이 작업을 수행하는 더 많은 Rails 방식이 여전히 체인 가능 (즉, AR :: Relation과 같이 느리게 페이지 매김 될 수 있음) 할 수 있습니까? 그것은 것

MyModel\ 
.where(...) 
.where(...) 

당신은 또한 어디에 (전무)를 사용할 수 있습니다 :

MyModel.where(...).where(...) 

또는이 같은 여러 줄을 넣어 더 좋은 구문 될 수 있습니다

+0

읽어주십시오 "[질문]"과 링크 된 페이지, 특히 "[질문 사항을 질문하는 방법

UNION 들어

는 레일 5 or를 사용 Smart Way] (http://catb.org/esr/faqs/smart-questions.html) "를 참조하십시오. 우리는 당신이 시도한 것을 알고 싶습니다. 왜 작동하지 않는지. 서면으로, 당신은 우리에게 일반적인 생각을 던지라고 요구합니다. –

+1

나는 동의하지 않는다. ActiveRecord 또는 Arel을 사용하여 같은 테이블에서 두 쿼리의 교차를 나타내는 매우 구체적인 작업을 수행하는 방법을 묻습니다. 그들은 별도의 변수로 저장되므로 첫 번째 대답과 같이 실제로 묶일 수는 없습니다. 나는 기본적으로 모든 것을 시도해 보았고 Arel을 똑바로 사용하여보다 강력한 솔루션을 작성했습니다. – max

답변

0

는 INTERSECT를 들어, 단지 사용 그 관계에 아무런 영향을 미치지 않는다. 이는 프로그래밍 방식으로 where 조건 (예 : where({a: a_val} if a_val.present?)을 구성 할 때 유용합니다.

MyModel.where(...).or(MyModel.where(...)) 

또는 여러 구문 :

MyModel\ 
.where(...) 
.or(
MyModel\ 
.where(...) 
)