2014-05-13 1 views
2

아무 것도 반환하지 않는 몽고이드 기준을 만들어야합니다. 메소드의 "none"- 종류를 찾을 수 없으므로 대신 Model.where (id : nil) 또는 Model.any_in (id : nil)을 수행하고 있습니다. 그러나 이것은 좋지 않으며 db를 쿼리합니다.아무 것도 반환하지 않는 몽고 이드 기준

db (예 : Model.none())를 쿼리하지 않고도 빈 결과를 반환하는 mongoid에 자신의 선택기를 추가하고 싶지만 어디서 어떻게 처리해야하는지 모르겠다. 누군가 도울 수 있습니까?

참고 : 발신자가 이미 비어 있음을 알지 못해 기준을 연결할 수 있기 때문에 필요합니다.

답변

5

당신은 어떤 버전의 몽고 이드입니까? 내가 Model.none을하려고 할 때 때문에 빈 집합을 반환 : 당신이, 당신이 변화를 통합하려고 할 수있는 버전으로 업데이트 할 수없는 경우

Model.none 
Model.none.count # => 0 

none이 버전 4에서 추가되었다. at line 309 in /lib/mongoid.criteria.rb에서 이러한 방법은 정의 될 필요가 :

def none 
    @none = true and self 
end 

def empty_and_chainable? 
    [email protected] 
end 

Mongoid::Contextual#create_contextto be changed 필요 :

def create_context 
    return None.new(self) if empty_and_chainable? 
    embedded ? Memory.new(self) : Mongo.new(self) 
end 

그럼 당신은 `/lib/mongoid/contextual/none.rb'를 포함 할 수 있습니다.

편집 : this Gist backports .none to Mongoid 3 :

module Mongoid 
    class Criteria 
    def none 
     @none = true and self 
    end 

    def empty_and_chainable? 
     [email protected] 
    end 
    end 

    module Contextual 
    class None 
     include ::Enumerable 

     # Previously included Queryable, which has been extracted in v4 
     attr_reader :collection, :criteria, :klass 

     def blank? 
     !exists? 
     end 
     alias :empty? :blank? 

     attr_reader :criteria, :klass 

     def ==(other) 
     other.is_a?(None) 
     end 

     def each 
     if block_given? 
      [].each { |doc| yield(doc) } 
      self 
     else 
      to_enum 
     end 
     end 

     def exists?; false; end 

     def initialize(criteria) 
     @criteria, @klass = criteria, criteria.klass 
     end 

     def last; nil; end 

     def length 
     entries.length 
     end 
     alias :size :length 
    end 

    private 

    def create_context 
     return None.new(self) if empty_and_chainable? 
     embedded ? Memory.new(self) : Mongo.new(self) 
    end 
    end 

    module Finders 
    delegate :none, to: :with_default_scope 
    end 
end 
+0

오른쪽,하지만 내가 사용하는 3.1.4에서 버전 4에 존재합니다. 나는 아무 것도 내 프로젝트에 복사하려고 시도하지 않을 것이다. 아니면 좋은 생각이 아닌가? – stanley90

+0

'None'을 통합하기 위해 노력해야한다고 생각하는 것으로 내 대답을 업데이트했습니다. 어쩌면 눈살을 찌푸리게 될지도 모르지만 그 변화는 그리 멀지 않은 것처럼 보이므로 괜찮습니다. –

+0

그래서 나는이 https://gist.github.com/stanley90/5a5f35be733642e2afc9 (설정/이니셜 라이저)와 같은 원숭이 패치를 시도하고 있지만 작동하지 않습니다. 내가 잘못하고 있니? – stanley90