2011-09-05 25 views
6

Tôi đang cố gắng thực hiện truy vấn ActiveRecord trong Rails 3.1 nơi tôi sắp xếp kết quả thành các tập hợp con của các mục được nhóm, trong trường hợp này được nhóm theo ngày.Rails Kết quả nhóm ActiveRecord thành các tập hợp con theo ngày

Tôi nghĩ rằng mã của tôi có thể giải thích tốt nhất. Đây là phương pháp của tôi, hoạt động nhưng phát hành 4 truy vấn để hoàn thành công việc. Nó không có vẻ rất hiệu quả để làm điều đó theo cách này.

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 

Sử dụng những gợi ý từ Dave Newton dưới đây để sử dụng group_by, tôi đã viết lại phương pháp như thế này:

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 

Ít nhất tôi có nó xuống chỉ có 2 câu hỏi ngay bây giờ.

Sau đó, tôi lại viết phương pháp này một lần nữa như thế này:

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

Trên một mặt lưu ý: Tôi có nên không được chaining rất nhiều phương pháp với nhau, và định dạng thụt đầu dòng ưu tiên cho các phương pháp lồng nhau và băm là gì?

+0

Câu hỏi này: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-used-in-an-aggregate-function/6953704#6953704, thảo luận về một cái gì đó tương tự – rubish

Trả lời

6

Tại sao không chọn tất cả, hãy sử dụng một cái gì đó như group_by?

+1

Cuối cùng bộ sưu tập này sẽ được hỗ trợ bởi hàng nghìn hàng và tôi chỉ muốn giá trị mục nhập 3 ngày gần đây nhất, và những ngày đó phải có ít nhất 1 mục nhập. Nếu tôi không nhầm, đề xuất của bạn là kéo tất cả các hàng cho truy vấn. Tôi có thể làm điều đó nhưng tôi muốn giữ hành vi tôi mô tả. –

+0

Tôi cho rằng tôi có thể thực hiện ánh xạ ngày cho các mục bằng cách sử dụng phương thức group_by, sau khi tôi chọn lần 2. Điều đó sẽ đưa tổng số truy vấn xuống 2. –

+0

Nếu có ít nhất một mục nhập mỗi ngày, có vẻ như bạn chỉ có thể chọn dựa trên phạm vi ngày và nhóm đã được truy lục. –

Các vấn đề liên quan