2011-09-09 16 views
6

Mongoid :: Paranoia dodaje domyślny zakres do modelu, który generuje kryteriaszyny mongoid jasnych kryteriów

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

mogę znaleźć usuniętych dokumentów z Model.deleted który generuje,

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

Jak można Zastanawiam się nad tym, aby móc przeszukiwać zarówno dokumenty usunięte, jak i nieusunięte.

PS Model.unscoped nie działa

+3

unscoped działa teraz. – edbond

Odpowiedz

5

Spróbuj (jej rodzaju włamania):

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

dzięki, to dostanie zadanie – Dipil

0

Spróbuj

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

Model.all_objects 

UPD

pole deleted_at jest polem datetime, jak polach Domyślna created_at wstawionych przez mongoid znaczników czasu, więc zgłasza wyjątek, gdy jest zaznaczone jako usunięty_at w [true, false], które są boolean

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

Pole deleted_at to pole datetime, takie jak domyślne pola created_at wstawiane przez mongoidowe znaczniki czasu, więc zgłasza wyjątek, gdy jest zaznaczone dla delete_at w [true, false], które są wartościami logicznymi. – Dipil

+0

rozumiem, zaktualizuję teraz odpowiedź – fl00r

+0

@ fl00r Nie uda się wykonać zadania, późniejsze kryteria zastąpią poprzednie kryteria. To jest jak ustawienie 'hash [: deleted_at] = {" $ exists "=> false}; hash [: deleted_at] = {"$ exists" => true} ' – rubish

2

Wziąłem się za pomocą:

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

ale self.unscoped wydaje się działać zbyt.

+0

Model.unscoped.selector działa świetnie na jednorazowych – loopj

0

Jeśli ktoś szuka sposobu, aby usunąć jeden z zakresów od kryteriów można zrobić to tak:

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

Można kryteria łańcuchowe do zapytania po tym, więc jest naprawdę przydatna.