我正在尝试在Rails 3.1中执行ActiveRecord查询,其中我将结果排序为分组项的子集合,在这种情况下按日期分组。
我认为我的代码可以解释得最好。这是我的方法,它可以工作,但会发出4个查询来完成工作。这样做似乎效率不高。
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
使用Dave Newton的建议使用group_by,我重写了这样的方法:
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
至少我现在只有2个查询。
然后我再次重写这个方法:
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
}
}
旁注:我不应该将这么多方法链接在一起,嵌套方法和哈希的首选缩进格式是什么?