sta*_*y90 5 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
Run Code Online (Sandbox Code Playgroud)
none已在版本4中添加.如果无法更新到该版本,则可以尝试集成更改.第309行的/lib/mongoid.criteria.rb这些方法需要定义:
def none
@none = true and self
end
def empty_and_chainable?
!!@none
end
Run Code Online (Sandbox Code Playgroud)
Mongoid::Contextual#create_context也需要改变:
def create_context
return None.new(self) if empty_and_chainable?
embedded ? Memory.new(self) : Mongo.new(self)
end
Run Code Online (Sandbox Code Playgroud)
然后你可以包含`/lib/mongoid/contextual/none.rb'.
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1085 次 |
| 最近记录: |