2011-09-05 12 views
6

Próbuję wykonać zapytanie ActiveRecord w Rails 3.1, w którym sortuję wyniki na podgrupę pogrupowanych elementów, w tym przypadku pogrupowanych według daty.Railsowe wyniki grupy ActiveRecord na podzbiory według daty

Myślę, że mój kod najlepiej to wyjaśnia. To jest moja metoda, która działa, ale wydaje 4 zapytania, aby wykonać zadanie. Wydaje się, że nie jest to zbyt wydajne w ten sposób.

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 

Korzystanie sugestię z Davem Newton poniżej użyć group_by, mam ponownie napisany metodę tak:

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 

Przynajmniej mam go tylko 2 zapytaniami teraz.

Potem ponownie napisał metodę znowu tak:

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

Na marginesie: Czy mogę nie być łańcuchowym tak wiele metod razem i jaki jest preferowany format wcięcie dla zagnieżdżonych metod i skrótów?

+0

To pytanie: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-used-in-an-aggregate-function/6953704#6953704, omawia coś podobnego. – rubish

Odpowiedz

6

Dlaczego nie wybrać wszystkich, a następnie użyć czegoś takiego jak group_by?

+1

Ostatecznie ta kolekcja będzie wspierana tysiącami wierszy i chcę tylko ostatnich 3 dni wartości wpisów, a te dni powinny mieć co najmniej 1 wpis każdego. Jeśli się nie mylę, twoją sugestią jest wyciągnięcie wszystkich wierszy zapytania. Mógłbym to zrobić, ale chcę zachować zachowanie, które opisałem. –

+0

Przypuszczam, że mogłem zrobić mapowanie dni na wpisy przy użyciu metody group_by, po tym jak zrobię mój drugi wybór. Spowoduje to zmniejszenie liczby zapytań do 2. –

+0

Jeśli zawsze będzie co najmniej jeden wpis dziennie, wydaje się, że możesz wybrać tylko na podstawie zakresu dat i grupy, która została raz pobrana. –