2010-09-25 8 views
5

Necesito crear un ámbito con nombre en Mongoid que compare dos campos de Tiempo dentro del mismo documento. Tal comoÁmbito denominado Mongoid que compara dos campos de tiempo en el mismo documento

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

Esto, obviamente, no va a funcionar, ya que trata :checked_at como un símbolo, no el campo real. ¿Alguna sugerencia sobre cómo se puede hacer esto?

Actualización 1

Aquí está mi modelo en el que tengo este ámbito declarado, con una gran cantidad de código extra despojado.

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 

Esto me da el siguiente error:

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

Respuesta

7

Por lo que yo sé, no lo hace mongodb consultas de soporte contra valores dinámicos. pero se puede usar una función javascript:

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

Para acelerar este proceso se podría añadir un atributo como "is_unresolved", que se establece en true en la actualización cuando se compara esta condición (y el índice de eso).

+0

Impresionante, esto funciona genial. También gracias por la sugerencia de rendimiento. –

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

Por ejemplo, esto va a funcionar:

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

Eso no funciona. 'método indefinido' checked_at 'para User: Class (NoMethodError) '. La segunda declaración funcionará, ya que estás pasando un objeto. Necesito comparar dos campos que forman parte del mismo documento/modelo. –

+0

Necesito que publique su clase de usuario, solo la inclusión mongoid y la definición de checked_at y su alcance –

+0

Edité la pregunta original con la clase User. Gracias por su tiempo hasta ahora, Jesse. –

1

No estoy seguro de si te gusta este método, no es el mejor, pero debería funcionar.

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 

se le llama con User.unresolved (my_user_object) Parece ahora después de releer su puesto que esto probablemente no va a hacer lo que quiera. Si esto es cierto, entonces probablemente necesite usar MapReduce o posiblemente el método de Baju (no lo han probado)

Cuestiones relacionadas