【问题标题】:rails mongoid clear criteriarails mongoid 明确的标准
【发布时间】:2011-11-13 13:12:18
【问题描述】:

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>

我怎样才能覆盖它,以便我可以搜索已删除和未删除的文档。

PSModel.unscoped 不起作用

【问题讨论】:

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


    【解决方案1】:

    如果有人正在寻找从条件中删除某个范围的方法,您可以这样做:

    query = Item.published.before(DateTime.now).unblocked
    query.remove_scoping(Item.before(DateTime.now))
    

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

    【讨论】:

      【解决方案2】:

      我已经开始使用了:

       def self.all!
         Mongoid::Criteria.new self
       end
      

      但 self.unscoped 似乎也可以工作。

      【讨论】:

        【解决方案3】:

        试试这个(它的黑客):

        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")
        

        【讨论】:

          【解决方案4】:

          试试这个

          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
          

          【讨论】:

          • deleted_at 字段是一个日期时间字段,与 mongoid 时间戳插入的默认 created_at 字段一样,因此当在布尔值 [true, false] 中检查 deleted_at 时会抛出异常。
          • @fl00r 它不会完成工作,后面的标准将覆盖前面的标准。就像设置hash[:deleted_at] = {"$exists"=&gt;false}; hash[:deleted_at] = {"$exists"=&gt;true}
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-27
          • 1970-01-01
          相关资源
          最近更新 更多