2011-09-09 3 views
6

MongoId :: Paranoia ajoute une portée par défaut au modèle qui génère les critèresrails MongoId critères clairs

#<Mongoid::Criteria 
    selector: {:deleted_at=>{"$exists"=>false}}, 
    options: {}, 
    class: Line, 
    embedded: false> 

je peux trouver supprimer des documents avec Model.deleted qui génère,

#<Mongoid::Criteria 
    selector: {:deleted_at=>{"$exists"=>true}}, 
    options: {}, 
    class: Line, 
    embedded: false> 

Comment Je remplace cela afin que je puisse rechercher à la fois des documents supprimés et non supprimés.

PS Model.unscoped ne fonctionne pas

+3

non-délimité fonctionne maintenant. – edbond

Répondre

5

Essayez ce (genre de bidouille):

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

merci, cela fait le travail – Dipil

0

Essayez cette

def self.all_objects 
    where(:deleted_at.in => [false, true]) 
end 

Model.all_objects 

UPD

le champ deleted_at est un champ datetime, comme les champs de created_at par défaut insérés par MongoId horodatages, donc il lève une exception lorsqu'il est vérifié pour deleted_at dans [true, false] qui sont booléen

def self.all_objects 
    where(:deleted_at=>{"$exists"=>false}).and(:deleted_at=>{"$exists"=>true}) 
end 
+0

Le champ deleted_at est un champ datetime, comme les champs created_at par défaut insérés par mongoid timestamps, donc il lève une exception lorsqu'il est vérifié pour deleted_at dans [true, false] qui sont booléen. – Dipil

+0

l'ai, je vais mettre à jour ma réponse maintenant – fl00r

+0

@ fl00r Il ne va pas faire le travail, les critères ultérieurs remplaceront les critères précédents. C'est comme si 'hash [: deleted_at] = {" $ exists "=> false}; hash [: deleted_at] = {"$ exists" => true} ' – rubish

2

J'ai pris à l'aide:

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

mais self.unscoped semble fonctionner aussi.

+0

Model.unscoped.selector fonctionne très bien pour des one-offs – loopj

0

Si quelqu'un est à la recherche d'un moyen de supprimer l'un des champs d'application de critères que vous pouvez le faire comme ceci:

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

Vous pouvez les critères de la chaîne pour interroger après il est vraiment utile.