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?
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