2011-06-01 15 views
5

¿No sé si es posible? Necesito usar el método de instancia con/dentro del alcance. Algo como esto:método de instancia en el alcance

scope :public, lambda{ where ({:public => true}) } 

e invoque el método de instancia (¿completo?) En cada registro para ver si se completa. el alcance público aquí debe devolver todos los registros que son públicos y se completan y la finalización de un registro se determina mediante un método de instancia '¿completo?'

¿Alguna posibilidad?

Gracias

+0

enviar Tal vez en un lambda que contiene la completa? lógica como un parámetro para el alcance lambda? – Zabba

Respuesta

10

Scopes son sobre la generación de lógica de consulta utilizando Arel. Si no puede representar la lógica del completo? método en SQL, entonces está atascado

Los alcances - en rieles 3 al menos - están destinados a encadenar la lógica de consulta sin devolver un conjunto de resultados. Si necesita un conjunto de resultados que hacer sus pruebas para completa que necesita para hacer algo como

class MyModel < ActiveRecord::Base 
    scope :public, lambda{ where ({:public => true}) } 

    def self.completed_public_records 
    MyModel.public.all.select { |r| r.completed? } 
    end 
end 

# elsewhere 
MyModel.completed_public_records 

O si necesita más flexibilidad

class MyModel < ActiveRecord::Base 
    scope :public, lambda{ where ({:public => true}) } 
    # some other scopes etc 


    def self.completed_filter(finder_obj) 
    unless finder_obj.is_a?(ActiveRecord::Relation) 
     raise ArgumentError, "An ActiveRecord::Relation object is required" 
    end 
    finder_obj.all.select { |r| r.completed? } 
    end 
end 

# elsewhere 
MyModel.completed_filter(MyModel.public.another_scope.some_other_scope) 
+0

También estaba pensando en el primer enfoque, pero sin alcance. Eso significa usar un método de clase llamado público y encontrar todos los registros públicos y luego filtrar por completado. método, pero quería ver si había alguna manera de hacerlo utilizando el alcance. Además, no puedo representar la lógica de completar? método en el lenguaje de consulta, así que creo que necesito usar el método de clase. – bikashp

0

creé una rubygem para este problema exacto unos pocos Hace meses cuando tuve el mismo problema.

Le permite agregar métodos que funcionan en el conjunto de resultados de la consulta, pero abstrae los métodos en otra clase para que no se confunda con su modelo.

Compruébelo usted mismo: https://github.com/coryodaniel/collectively

Cuestiones relacionadas