Rails ActiveRecord组按日期将结果转换为子集合

时间:2011-09-05 00:31:45

标签: ruby-on-rails activerecord

我正在尝试在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
        }
      }

旁注:我不应该将这么多方法链接在一起,嵌套方法和哈希的首选缩进格式是什么?

1 个答案:

答案 0 :(得分:6)

为什么不选择它们然后使用group_by

之类的东西