2011-09-05 13 views
6

Sto cercando di eseguire una query ActiveRecord in Rails 3.1 in cui ho ordinato i risultati in sottoinsiemi di elementi raggruppati, in questo caso raggruppati per data.Rails ActiveRecord raggruppa i risultati in raccolte secondarie per data

Penso che il mio codice possa spiegarlo meglio. Questo è il mio metodo, che funziona ma emette 4 query per portare a termine il lavoro. Non sembra molto efficiente farlo in questo modo.

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 

Utilizzando il suggerimento di Dave Newton di seguito per utilizzare group_by, ho riscritto il metodo come questo:

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 

almeno ho giù a solo 2 domande ora.

Poi ho ri-scritto il metodo di nuovo in questo modo:

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

Su un lato nota: non dovrei essere concatenamento tanti metodi insieme, e ciò che è il formato di rientro preferito per i metodi e gli hash annidati?

+0

Questa domanda: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-used-in-an-aggregate-function/6953704#6953704, discute qualcosa di simile – rubish

risposta

6

Perché non selezionarli tutti quindi utilizzare qualcosa come group_by?

+1

Alla fine questa raccolta sarà supportata da migliaia di righe e voglio solo i 3 giorni più recenti di voci, e quei giorni dovrebbero avere almeno 1 voce ciascuno. Se non sbaglio, il tuo suggerimento è quello di tirare giù tutte le righe per la query. Potrei farlo ma voglio mantenere il comportamento che ho descritto. –

+0

Suppongo che potrei fare la mappatura dei giorni alle voci usando il metodo group_by, dopo aver fatto la mia seconda selezione. Ciò porterebbe la query totale a 2. –

+0

Se ci sarà sempre almeno una voce al giorno, sembra che tu possa semplicemente selezionare in base a un intervallo di date e al gruppo una volta recuperati. –

Problemi correlati