如何在Ruby中将数组转换为数组数组?

时间:2016-06-16 09:33:09

标签: ruby-on-rails arrays dictionary

我有一个查询company_in_outs = company.in_outs.where('date >= ? and date <= ?', Date.today.at_beginning_of_month, Date.today.end_of_month),它返回给我<ActiveRecord::AssociationRelation。现在我想把这个数组变成一个数组数组,这些数组是根据日期值分组的。

for example.

#<ActiveRecord::AssociationRelation [#<InOut id: 2806, date: "2016-06-01", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1>,#<InOut id: 2806, date: "2016-06-01", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1>,#<InOut id: 2806, date: "2016-06-01", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1>,#<InOut id: 2806, date: "2016-06-02", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1>,#<InOut id: 2806, date: "2016-06-02", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1>,#<InOut id: 2806, check_in: "2016-06-24 16:16:00", check_out: "2016-06-25 01:16:00", date: "2016-06-01", created_at: "2016-06-02 07:01:52", updated_at: "2016-06-16 07:43:45", company_id: 1> ]

从这个数组中我想制作一个array of arrays,根据grouped需要date。意味着包含same date的所有记录都必须groupedone array。像这样我想拥有array of arrays

2 个答案:

答案 0 :(得分:0)

如果您已经加载了所有记录:

dgvMeasures.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText
dgvMeasures.SelectAll()
IO.File.WriteAllText(fileName, dgvMeasures.GetClipboardContent.GetText.TrimEnd)
dgvMeasures.ClearSelection()

如果您不使用Rails(ActiveSupport),则应使用inject而不是each_with_object

company_in_outs.each_with_object({}) do |record, hash|
  (hash[record.date] ||= []) << record
end.values

我认为您也应该能够在db网站上进行排序。

答案 1 :(得分:0)

在Array中实际上有一个group_by方法,但它不返回数组数组,而是返回一个对象,该对象包含与值相同的键和数组。

在你的情况下:

company_in_outs.group_by do |com|
    com.date
end

上面的代码将返回按日期分组的对象作为键,以及与值相同的日期数组。

你可以遍历返回的对象,它将返回键和值,并做任何你喜欢的事情:)

希望这有帮助!