Mongoid :: Paranoia为生成标准的模型添加默认范围
#<Mongoid::Criteria
selector: {:deleted_at=>{"$exists"=>false}},
options: {},
class: Line,
embedded: false>
我可以找到使用Model.deleted生成的已删除文档,
#<Mongoid::Criteria
selector: {:deleted_at=>{"$exists"=>true}},
options: {},
class: Line,
embedded: false>
如何覆盖此项,以便我可以搜索已删除和未删除的文档。
PS Model.unscoped
不起作用
答案 0 :(得分:5)
尝试这种(它的黑客攻击):
class User
include Mongoid::Document
include Mongoid::Paranoia
def self.ignore_paranoia
all.tap {|criteria| criteria.selector.delete(:deleted_at)}
end
end
# ignore paranoia is defined on model, so can't chain it to criteria or scopes
# but it returns criteria, so can chain other scope and criteria to it
User.ignore_paranoia.some_scope.where(:whatever => "my_custom_value")
答案 1 :(得分:2)
我已经开始使用:
def self.all!
Mongoid::Criteria.new self
end
但是self.unscoped似乎也有效。
答案 2 :(得分:0)
试试这个
def self.all_objects
where(:deleted_at.in => [false, true])
end
Model.all_objects
<强> UPD 强>
deleted_at字段是一个日期时间字段,就像mongoid时间戳插入的默认的created_at字段一样,因此当检查[true,false]中的deleted_at时会抛出异常,这是布尔值
def self.all_objects
where(:deleted_at=>{"$exists"=>false}).and(:deleted_at=>{"$exists"=>true})
end
答案 3 :(得分:0)
如果有人正在搜索从标准中删除其中一个范围的方法,您可以这样做:
query = Item.published.before(DateTime.now).unblocked
query.remove_scoping(Item.before(DateTime.now))
您可以在此之后链接条件以进行查询,因此它非常有用。