2011-08-09 18 views
14

Tengo una clase Collection que tiene muchas monedas. Estoy tratando de seleccionar colecciones que tienen más de dos monedas. Actualmente, no tengo problemas para hacerlo a través de Ruby directo, pero eso es extremadamente ineficiente.¿Cómo unirse a una mesa y contar los registros en Rails 3?

Mi código actual:

collections = Collection.all.select { |c| c.coins.count > 2 } 

¿Cómo logro que a través de una llamada joins con Arel?

Gracias!

+0

No debe usar Colección como nombre de clase ... Hay varias estructuras incorporadas de Ruby que requieren colecciones (por ejemplo, colecciones de modelos de rieles) y puede suceder que anule algunas cosas que provocan un comportamiento inesperado .. – Lichtamberg

+2

Gracias por propina. ¿Alguna idea de cómo crear el 'join'? –

Respuesta

23

para responder a mi propia pregunta:

Collection.joins(:coins).group("coins.collection_id").having("count(coins.id) > 2") 

Sombrero de punta a KJF que pidió this similar question y para krakover para contestarla.

1

Agregue columnas counter_cache y consúltelas.

http://railscasts.com/episodes/23-counter-cache-column

+1

Gracias. Un contador de caché está destinado a guardar registros de conteo sobre la marcha. Dado que mis colecciones solo incluyen 2-5 monedas cada una, esto no es un problema y prefiero no almacenar una columna separada en la base de datos. ¿Alguna idea sobre cómo escribir la consulta 'join' usando Rails 3? –

Cuestiones relacionadas