rails mongoid明确的标准

时间:2011-09-09 06:35:22

标签: ruby-on-rails ruby ruby-on-rails-3 mongoid

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不起作用

4 个答案:

答案 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))

您可以在此之后链接条件以进行查询,因此它非常有用。