2011-09-05 12 views
6

Estoy tratando de hacer una consulta ActiveRecord en Rails 3.1 donde ordeno los resultados en subcolecciones de elementos agrupados, en este caso agrupados por fecha.Rails Resultados del grupo ActiveRecord en subcolecciones por fecha

Creo que mi código puede explicarlo mejor. Este es mi método, que funciona pero emite 4 consultas para hacer el trabajo. No parece muy eficiente hacerlo de esta manera.

def entry_days 
    days = @user.entry_groups.find(
    :all, 
    :select => 'date', 
    :limit => 3, 
    :group => 'date').map(&:date) 

    entry_days = days.map do |date| 
    { :date => date, 
     :entry_groups => @user.entry_groups.find_all_by_date(date) 
    } 
    end  
end 

El uso de la sugerencia de Dave Newton a continuación para utilizar group_by, he reescrito el método de la siguiente manera:

def entry_days 
    dates_with_entries = @user.entry_groups.find(
    :all, 
    :select => 'date', 
    :limit => 3, 
    :group => 'date').map(&:date) 

    @user.entry_groups.where(:date => dates_with_entries).all.group_by(&:date). 
    map do |date, entry_groups| 
     { :date => date, 
     :entry_groups => entry_groups } 
    end 
end 

Por lo menos tienen que bajar a sólo 2 consultas ahora.

Entonces me volvió a escribir el método de nuevo como esto:

dates_with_entries = user.entry_groups.all(
     :select => 'date', 
     :limit => num_days, 
     :order => 'date DESC', 
     :group => 'date').map(&:date) 

    entry_groups = user.entry_groups. 
     where(
     :date => dates_with_entries 
    ). 
     all(:order => 'date DESC') 

    entry_days = entry_days.group_by(&:date). 
     map { |date, entry_groups| 
     { 
      :date => date, 
      :entry_groups => entry_groups 
     } 
     } 

En una nota: ¿No debería ser el encadenamiento de tantos métodos juntos, y lo que es el formato de sangría recomendado métodos anidados y hashes?

+0

Esta pregunta: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-be-used-in-an-aggregate-function/6953704#6953704, discute algo similar – rubish

Respuesta

6

¿Por qué no seleccionarlos todos y luego usar algo como group_by?

+1

Eventualmente esta colección estará respaldada por miles de filas y solo quiero el valor de entradas de los últimos 3 días, y esos días deben tener al menos 1 entrada cada uno. Si no me equivoco, su sugerencia es desplegar todas las filas para la consulta. Podría hacerlo, pero quiero mantener el comportamiento que describí. –

+0

Supongo que podría hacer el mapeo de días para entradas usando el método group_by, después de hacer mi segunda selección. Eso reduciría el total de la consulta a 2. –

+0

Si siempre habrá al menos una entrada por día, parece que podría seleccionar según un rango de fechas y agrupar una vez recuperado. –

Cuestiones relacionadas