【问题标题】:Rails ActiveRecord group results into sub-collections by dateRails ActiveRecord 按日期将结果分组为子集合
【发布时间】:2011-09-05 17:31:28
【问题描述】:

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

附带说明:我不应该将这么多方法链接在一起吗?嵌套方法和散列的首选缩进格式是什么?

【问题讨论】:

标签: ruby-on-rails activerecord


【解决方案1】:

为什么不全部选择它们然后使用group_by之类的东西?

【讨论】:

  • 最终这个集合将由数千行支持,我只想要最近 3 天的条目,并且这些天应该至少有 1 个条目。如果我没记错的话,您的建议是下拉查询的所有行。我可以这样做,但我想保持我所描述的行为。
  • 我想在我进行第二次选择之后,我可以使用 group_by 方法将天数映射到条目。这将使查询总数减少到 2。
  • 如果每天至少有一个条目,似乎您可以根据检索到的日期范围和组进行选择。
  • 我最多希望 3 个不同的日期按降序排列。范围内可能存在差距,所以我想要今天、昨天和 2 周前的条目,如果这些是最近 3 天的条目。
  • 啊;我误解了“[...],那些日子应该至少有 1 个条目”——我的错。我可能会用普通的 SQL 嵌套选择来做到这一点。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2010-11-06
相关资源
最近更新 更多