微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 不返回任何内容的Mongoid标准

我需要创建一个mongoid标准,它不会返回任何内容.我找不到任何“无”方法,所以我做的是Model.where(id:nil)或Model.any_in(id:nil).
但是这不好,还会查询数据库.

我想将自己的选择器添加到mongoid,它将返回一个空结果,甚至不查询db(例如Model.none()),但不知道在哪里/如何做.有人可以帮忙吗?

注意:我需要这个,因为调用者可能会链接标准而不必知道它已经是空的.

解决方法

你在用什么版本的Mongoid?因为当我尝试Model.none时,它返回一个空集:

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

版本4中未添加任何内容.如果无法更新到该版本,则可以尝试集成更改.需要定义at line 309 in /lib/mongoid.criteria.rb的这些方法

def none
  @none = true and self
end

def empty_and_chainable?
  !!@none
end

Mongoid :: Contextual #create_context也需要to 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?
      !!@none
    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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐