0

를 방문 할 수 없습니다. 내 프로젝트에 훨씬 더 복잡한 쿼리를레일 3, 나는 <code>:except_ids</code> 범위와 사용자 모델을 Arel :: SelectManager

User.except_ids(User.except_ids(1,2)) 

내가

TypeError: Cannot visit Arel::SelectManager 

으로 끝낼하지만, 모든 작동합니다 - 그 범위를 제외하고는 예를 들어, 나는 이런 식으로 뭔가를 호출하는 경우. 범위를 실제 코드로 바꾸면 작동시킬 수 있지만 냄새가납니다.

그래서 이것을 찾으려면 어떤 방법이 있습니까?

답변

2

단일 SQL 쿼리로이 작업을 수행하려면 Arel에서 직접 지원하지 않는 subquery을 포함해야하지만, 예를 들어 this workaround을 사용할 수 있습니다.

표시되는 오류는 User.except_ids(1,2)ActiveRecord::Relation의 인스턴스를 반환한다는 사실에 기인합니다. 이는 람다 서명의 splat 연산자에 문제가 될 수 있습니다. 이것은 작동하지만 2 개의 쿼리가 발생합니다.

User.except_ids(User.except_ids(1,2).map(&:id)) 
+0

음, 사실, map (& : id)은 대괄호 안에 관계에 대한 결과를로드합니다. 모든 나의 조작의 요점은 하나의 거대한 쿼리를 생성하는 것입니다. –

+0

제 답변을 업데이트했습니다.보세요. – mxgrn

+1

이중 쿼리 솔루션의 효율성을 높이려면'User.except_ids (User.except_ids (1,2) .pluck ('id'))'대신 map : pluck을 사용하십시오. 이것은'SELECT *'보다는 오히려'SELECT id'를 생성하고, id 만있는 배열로 리턴합니다. – zykadelic