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

Chr*_*lsh 6 activerecord ruby-on-rails

我正在尝试在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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

至少我现在只有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
        }
      }
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ton 6

为什么不选择它们然后使用像group_by这样的东西?

  • 最终这个集合将由数千行支持,我只想要最近3天的条目,那些日子应该至少有1个条目.如果我没有弄错,你的建议就是下拉查询的所有行.我可以这样做,但我想保持我描述的行为. (2认同)