2010-09-25 15 views
5

Ho bisogno di creare un ambito denominato in Mongoid che confronta due campi Ora nello stesso documento. Come ad esempioAmbito denominato Mongoid confrontando due campi temporali nello stesso documento

scope :foo, :where => {:updated_at.gt => :checked_at}

Questo ovviamente non funzionerà come si tratta :checked_at come un simbolo, non il campo vero e proprio. Qualche suggerimento su come questo può essere fatto?

Update 1

Ecco il mio modello in cui ho questo scopo dichiarato, con un sacco di codice aggiuntivo messo a nudo fuori.

class User 
    include Mongoid::Document 
    include Mongoid::Paranoia 
    include Mongoid::Timestamps 

    field :checked_at, :type => Time 

    scope :unresolved, :where => { :updated_at.gt => self.checked_at } 
end 

questo mi dà il seguente errore:

'<class:User>': undefined method 'checked_at' for User:Class (NoMethodError)

risposta

7

Per quanto ne so, non lo fa MongoDB supporta le query rispetto ai valori dinamici. Ma è possibile utilizzare una funzione javascript:

scope :unresolved, :where => 'this.updated_at >= this.checked_at' 

Per accelerare l'operazione si potrebbe aggiungere un attributo come "is_unresolved" che sarà impostata su true in aggiornamento quando questa condizione è abbinato (e indice che).

+0

Fantastico, funziona alla grande. Grazie anche per il suggerimento di prestazione. –

3
scope :foo, :where => {:updated_at.gt => self.checked_at} 

Ad esempio, questo funzionerà:

scope :foo, where(:start_date.lte=>Date.today.midnight) 
+1

Questo non funziona. 'metodo non definito' checked_at 'per Utente: Class (NoMethodError) '. La seconda istruzione funzionerà, dato che stai passando un oggetto. Ho bisogno di confrontare due campi che fanno parte dello stesso documento/modello. –

+0

Hai bisogno di pubblicare la tua classe utente - solo l'include mongoid e la definizione per checked_at e il tuo ambito di applicazione –

+0

Ho modificato la domanda originale con la classe User. Grazie per il tuo tempo finora lontano Jesse. –

1

Non sono sicuro che questo metodo ti piaccia, non è il massimo, ma dovrebbe funzionare.

class User 
    include Mongoid::Document 
    include Mongoid::Paranoia 
    include Mongoid::Timestamps 

    field :checked_at, :type => Time 

    scope :unresolved, lambda{ |user| where(:updated_at.gt => user.checked_at) } 
end 

si chiami con User.unresolved (my_user_object) Sembra ora dopo aver riletto il tuo post che questo probabilmente non fare quello che vuoi. Se questo è vero, allora probabilmente dovrai usare MapReduce o il metodo di Baju (non l'hai testato)

Problemi correlati