2011-06-13 3 views
12

사용자에게 class 메소드가 있습니다. 반환은 사용자에게 복잡한 select/join/order/limit를 적용하고 관계를 반환합니다. 또한 where(:admin => true) 절을 적용합니다. 이 관계 객체가 있다면 나와 하나의 특정 where 문을 제거 할 수 있습니까?ActiveRecord :: Relation에서 'where'절을 제거합니다.

뭔가

User.complex_stuff.without_where(:admin => true) 

답변

6

where_values은 각각 where 쿼리를 보유하고 있으므로 사용자 시스템에서 :admin => true의 정확한 출력과 일치하도록 SQL을 조정해야합니다. 나는 강하게 것 그러나

@users = User.complex_stuff 
@users.where_values.delete_if { |query| query.to_sql == "\"users\".\"admin\" = 't'" } 

: 당신은 실제로 아직 쿼리를 실행하지 않은 경우에만 동작합니다 명심하십시오 (즉, 당신은 그것을에 .all라고, 또는 뷰에서의 결과를 사용하지 않은) 대신 complex_stuff 방법을 재구성하는 Emily의 답변을 사용하는 것이 좋습니다.

10

처럼 나는이 작업을 수행 할 수있는 방법을 발견하지 않았습니다. 가장 좋은 해결책은 기존 complex_stuff 방법을 재구성하는 것입니다.

먼저 을 추가하는 경우를 제외하고는 의 모든 방법이 수행하는 새로운 방법을 만듭니다. complex_stuff. 그런 다음 complex_stuff 메서드를 다시 작성하여 User.complex_stuff_without_admin.where(:admin => true)을 호출합니다.

기본적으로 반대편에서 접근하면됩니다. 불필요한 부분을 제거하는 대신 필요한 부분을 추가하십시오.

20

나는이 오래된 질문이다 알지만, 레일 4 지금이

User.complex_stuff.unscope(where: :admin) 

을 할 수 있기 때문에 당신이 unconditinoally

을 전체 where 부분을 unscope하려는 경우, 쿼리의 경우 관리자 부분을 제거합니다
User.complex_stuff.unscope(:where) 

추신 : 내가 만든 받고이 (Remove a 'where' clause from an ActiveRecord::Relation을 할 필요가

+0

사람에게하는 데 도움이 (더?)'User.complex_stuff. unscope (어디서 : : admin)'(http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-unscope 참조) – Samuel

+0

무슨 뜻인지 알겠지만, 오늘 밤에 두 번 확인하고 대답. –

0

덕분에 내 실수를 지적 @Samuel하기 스코프)를 두 개의 스코프에 합치는 동안, self.scope(from,to).values[:joins]과 같이했습니다.

'joined_scope'를 'where'절없이 구성한 두 개의 범위에서 값을 조인하고 싶었 기 때문에 별도로 'where'절을 추가 할 수있었습니다 ('AND'대신 'OR'을 사용하도록 변경됨)).

은 나를 위해,이과 같이, 결합 된 범위에 갔다 :

scope :joined_scope, -> (from, to) { 
    joins(self.first_scope(from,to).values[:joins]) 
    .joins(self.other_scope(from,to).values[:joins]) 
    .where(first_scope(from,to).ast.cores.last.wheres.inject{|ws, w| (ws &&= ws.and(w)) || w} 
    .or(other_scope(from,to).ast.cores.last.wheres.last)) 
} 

을 희망 unscope 방법은 다음과 같이 작동하지 않습니다