2011-09-09 20 views
6

Mongoid :: Paranoia aggiunge un ambito predefinito per il modello che genera i criterirotaie mongoid criteri chiari

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

posso trovare cancellato documenti con Model.deleted che genera,

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

Come può ho la precedenza, così posso cercare sia i documenti cancellati che quelli non cancellati.

PS Model.unscoped non funziona

+3

non spopolato ora funziona. – edbond

risposta

5

Prova questa (il suo tipo di hack):

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

grazie, questo ha fatto il lavoro – Dipil

0

Prova questa

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

Model.all_objects 

UPD

il campo deleted_at è un campo datetime, come i campi di default created_at inseriti dal timestamp mongoid, così genera un'eccezione quando viene controllato per deleted_at in [true, false] che sono booleani

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

il campo deleted_at è un campo datetime, come i campi created_at predefiniti inseriti dai timestamp mongoid, quindi genera un'eccezione quando viene controllato per deleted_at in [true, false] che sono booleani. – Dipil

+0

capito, aggiornerò la mia risposta ora – fl00r

+0

@ fl00r Non sta per ottenere il lavoro, i criteri successivi annulleranno i criteri precedenti. È come impostare 'hash [: deleted_at] = {" $ exists "=> false}; hash [: deleted_at] = {"$ exists" => true} ' – rubish

2

che ho preso ad usare:

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

ma self.unscoped sembra funzionare troppo.

+0

Model.unscoped.selector funziona alla grande per una tantum – loopj

0

Se qualcuno è alla ricerca di un modo per rimuovere uno dei cannocchiali da criteri si può fare in questo modo:

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

Puoi criteri catena di interrogare dopo che così è davvero utile.