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ì?
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