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?

Diese Frage: stackoverflow.com/questions/6953512/..., beschreibt etwas ähnliches

InformationsquelleAutor Chris M. Welsh | 2011-09-05

Schreibe einen Kommentar