2011-09-05 10 views
6

Rails 3.1'de bir ActiveRecord sorgusu yapmaya çalışıyorum; burada sonuçları gruplandırılmış öğelerin alt koleksiyonlarına sıralıyorum, bu durumda tarihe göre gruplandırılmış.ActiveRecord grup sonuçlarını tarihe göre alt koleksiyonlara yönlendirir

Sanırım kodum bunu en iyi açıklayabilir. Bu benim yöntemim, hangisi işe yarıyor, ancak işin yapılması için 4 sorgu yayınlıyor. Bu şekilde yapmak çok verimli görünmüyor. group_by kullanmak için aşağıdaki Dave Newton'dan öneri kullanma

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 

, böyle yöntemi yeniden yazdım:

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 

En azından ben şimdi sadece 2 sorguları için aşağı var. Yan not

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

:

Sonra böyle tekrar yöntemi yazdı yeniden bir araya pek çok yöntemler zincirleme olmamalı ve iç içe yöntem ve karmaları için tercih girinti biçimi nedir?

+0

Bu soru: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-used-in-an-aggregate-function/6953704#6953704, Benzer bir şey tartışıyor – rubish

cevap

6

Neden hepsini seçmiyorsunuz o zaman group_by gibi bir şey kullanıyorsunuz?

+1

Sonunda bu koleksiyon binlerce satır tarafından desteklenecek ve sadece en son 3 günlük giriş değerlerini istiyorum ve o günlerde her birinin en az 1 girişi olmalı. Yanılmıyorsam, öneriniz sorgu için tüm satırları aşağı çekmektir. Bunu yapabilirdim ama anlattığım davranışları devam ettirmek istiyorum. –

+0

Sanırım ikinci seçimimi yaptıktan sonra, günlerin haritalamasını group_by yöntemini kullanarak yapabilirim. Bu, sorgu toplamını 2'ye düşürür. –

+0

Her zaman günde en az bir giriş olacaksa, bir tarih aralığına ve bir kez alındıktan sonra gruba göre seçim yapabilirsiniz. –