2009-01-04 21 views
12

Rails gurus: Acabo de descubrir named_scope gracias a otro usuario de SO. :)Usando named_scope para obtener el recuento de filas

Me gustaría obtener el recuento de un conjunto de filas, es decir, un SELECT COUNT(*). Además, quiero poder encadenar ámbitos con nombre en la llamada.

¿Es esto un uso legítimo (aunque extraño) del alcance designado?

named_scope :count, :select => "COUNT(*) as count_all" 

Entonces me puede hacer (por ejemplo): se accede

@foobar = Foobar.count.scope.scope.scope 

El recuento a través de @foobar.first.count_all.

(Editado para tratar los comentarios de Allan)

que podría hacer:

@foobar = Foobar.scope.scope.scope.size 

Pero esto causaría una consulta resultado y no el más rápido SELECT COUNT(*) consulta. Tengo una gran cantidad de filas en la base de datos que estoy consultando.

¿Hay una mejor manera de hacerlo?

Respuesta

20

la funcionalidad que está buscando está construido en

Foobar.count # SELECT count(*) AS count_all FROM "foobars" 
Foobar.named_scope.count # SELECT count(*) AS count_all FROM "foobars" WHERE .... 

Si ejecuta script/server en modo dev, verá las consultas a medida que se ejecutan.

+3

Duh. A veces las cosas son tan sencillas que echo de menos lo obvio. ¡Gracias! – unknownuser

+0

Corrígeme si estoy trabajando pero esto no parece funcionar si su alcance con nombre se ve así: def self.with_full_name select ("users. *, CONCAT (first_name, last_name) AS full_name") final –

2

No creo que esto sea correcto en absoluto. Los ámbitos se utilizan para refinar las declaraciones de búsqueda y la consulta de recuento no se reproducirá bien con estos.

2

Hay una mejor manera de hacerlo, los rieles ya le dan los medios.

Usando su ejemplo, usted podría hacer esto:

@foobar_size = Foobar.all.size #returns integer equal to total rows of Foobar 

e incluso se alcance este modo:.

@banned_foobars = Foobar.scope_to_find_banned.size #returns integer equal to total rows for "scope_to_find_banned" 
+0

Esto es lo que originalmente había intentado. El problema con esto es que no aprovecha el hecho de que SELECT COUNT (*) es una consulta relativamente rápida. Haría una consulta de fila, y es mucho más lento. – unknownuser

+0

¡Ah! Veo a que te refieres. Por favor perdone mi malentendido. –

Cuestiones relacionadas