2014-09-18 8 views
1

mongomapper를 통해 쿼리하는 mongo가있는 레일 앱이 있습니다.mongomapper (및 plucky)와 함께 "in"절 연결

내 응용 프로그램의 다른 부분에서 두 개의 $in 절을 쿼리에 추가하고 싶습니다. 예 :

def where_clause1 
    where(app_ids: {'$in' => [5, 42, 23]}) 
end 

def where_clause2 
    where(app_ids: {'$in' => [44, 5, 87]}) 
end 

두 조항을 서로 배타적으로 사용하고 싶습니다.

는하지만 내가 할 경우 :

$> User.where_clause1 
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
    app_ids: {"$in"=>[5, 42, 23]}, transformer: ...> 
$> User.where_clause2 
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
    app_ids: {"$in"=>[44, 5, 87]}, transformer: ...> 
# so far so good 

#But: 
$> User.where_clause1.where_clause2 
=> #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery 
    app_ids: {"$in"=>[5, 42, 23, 44, 87]}, transformer: ...> 

내가 안으로 $in 두 개의 절을 체인 경우, 잘난는 app_ids에 노동 조합을 수행하고 두 $in 절을 병합합니다. 나는 대신 교차로를 원합니다 : [5].

어떻게하면됩니까? 나는 User.where(...).andWhere(...)을 시도했지만 그것이 존재하지 않습니다. 수동으로 두 app_ids 목록을 직접 교차시키고 싶지 않습니다.

답변

2

"체인화"가 실제로 구현되는 방법을 고려해야합니다. 사실 이것은 사실 전달 된 주장의 "병합"에 불과하며, 여기서 "노동 조합"행동이 관찰되는 이유입니다.

특히도 후대를 위해 여기에 나열된 this code은이 : 그래서

def where(hash={}) 
    clone.tap { |query| query.criteria.merge!(CriteriaHash.new(hash)) } 
    end 

당신은 당신이 그렇게 할 자신 만의 방법을 구현하는 최고의 해제 여기에 "교차로"어떤 종류를 기대합니다. 이 동작은 다른 직접 작업의 결과로 쿼리에있을 수있는 기존 인수를 "병합"하는 것입니다.