ruby on rails - query - Rails/Arel: seleccionando todos los registros como ActiveRecord:: Relation
ruby rails active record (3)
Uso de Arel in Rails: estoy buscando una forma de crear una relación ActiveRecord::Relation
que resulte efectivamente en la SELECT * FROM table
, que aún puedo manipular más.
Por ejemplo, tengo un modelo que se divide en varias categorías y devuelvo recuentos para estos de la siguiente manera:
relation = Model.where(:archived => false) # all non-archived records
record_counts = {
:total => relation.count,
:for_sale => relation.where(:for_sale => true).count
:on_auction => relation.where(:on_auction => true).count
}
Esto funciona bien, y tiene la ventaja de disparar COUNT
consultas a MySQL, en lugar de seleccionar realmente los registros.
Sin embargo, ahora necesito incluir registros archivados en los recuentos, pero relation = Model.all
da relation = Model.all
resultado una Array
, y estoy buscando una relación ActiveRecord::Relation
.
La única forma en que puedo pensar en hacer esto es model.where(model.arel_table[:id].not_eq(nil))
, que funciona, pero parece un poco absurdo.
¿Alguien puede aclarar esto?
Para Rails 4.1 y superior: Model.all
devuelve una relación (donde antes no)
Para Rails 4.0: Model.where(nil)
Para Rails 3.x: Model.scoped
Pruebe relation = Model.scoped
. Eso le dará la relación en lugar de los resultados reales.
Querrías:
relation = Model.scoped
que si ves qué relación es, de hecho es una ActiveRecord::Relation
.
Como puedes ver en esta página:
http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped
Dice lo siguiente:
Los ámbitos anónimos tienden a ser útiles cuando se procesan consultas complejas, cuando es conveniente pasar valores intermedios (ámbitos) como objetos de primera clase.