Rails-ActiveRecord-Gruppe Ergebnisse in der sub-Sammlungen nach Datum
Ich versuche zu tun, eine ActiveRecord-Abfrage in Rails 3.1, wo ich die Sortierung der Ergebnisse in der sub-Sammlungen gruppierte Elemente, in diesem Fall nach Datum gruppiert.
Ich glaube, mein code erklären kann es am besten. Dies ist meine Methode, die funktioniert, aber Probleme 4 Abfragen, um den job zu erledigen. Es scheint nicht sehr effizient zu tun, es auf diese Weise.
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
Mit dem Vorschlag von Dave Newton unter Verwendung group_by, die ich neu geschrieben haben, die Methode so:
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
Zumindest habe ich es unten zu nur 2 queries jetzt.
Dann habe ich erneut geschrieben erneut die Methode so:
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
}
}
On a side note: Sollte ich nicht die Verkettung so viele Methoden zusammen, und was ist der bevorzugte Einzug format für verschachtelte Methoden und hashes?
InformationsquelleAutor Chris M. Welsh | 2011-09-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht wählen Sie Sie alle, dann verwenden Sie etwas wie group_by?
Ich nehme an, ich könnte tun, die Zuordnung der Tage zu den Einträgen mit dem group_by-Methode, nachdem ich meinen 2. wählen Sie. Bringen würde die Abfrage insgesamt runter auf 2.
Wenn es wird immer mindestens ein Eintrag pro Tag, scheint, wie Sie könnten nur wählen Sie einen Datumsbereich und die Gruppe mal abgerufen.
Ich möchte höchstens 3 verschiedene Daten absteigend sortiert. Es ist möglich, Lücken in der Palette, so möchte ich die Einträge von heute, gestern und vor 2 Wochen wenn das sind die 3 die letzten Tage mit Einträgen.
Ah; ich missverstanden, "[ ... ] und diese Tage sollte mindestens 1 Eintrag jeweils" - mein bad. Ich würde wahrscheinlich tun Sie dies mit plain ol' SQL geschachtelte select.
InformationsquelleAutor Dave Newton