如何在Rails中访问键为数组的哈希?

时间:2019-07-09 06:13:00

标签: ruby-on-rails arrays

我正在尝试访问具有这种结构(每个用户在特定日期的状态)的数据。如您所见,哈希键都是数组。此数据已使用group_by从数据库中检索。

data = {
  ["active", "Rick"]=>["2019-07-09", "2019-07-10"],
  ["active", "Morty"]=>["2019-07-09", "2019-07-10"],
  ["active", "Summer"]=>["2019-07-09", "2019-07-10"],
  ["inactive", "Rick"]=> ["2019-07-01", "2019-07-02", "2019-07-03"],
  ["inactive", "Summer"]=>["2019-07-15"]
}

我希望此数据为嵌套哈希,如下所示。有没有办法重组它?

我知道可以像这样data[["active", "Summer"]]来访问哈希中的每个项目。我尝试做类似data[["active", "*"]]的操作(以获取所有用户的活动状态数据),但这没有用。

data = {
  "active"=>{
    "Rick"=>["2019-07-09", "2019-07-10"],
    "Morty"=>["2019-07-09", "2019-07-10"],
    "Summer"=>["2019-07-09", "2019-07-10"]
  },
  "inactive"=>{
    "Rick"=>["2019-07-01", "2019-07-02", "2019-07-03"],
    "Summer"=>["2019-07-15"]
  }
}

2 个答案:

答案 0 :(得分:2)

这应该有效:

new_data = {}
data.each do |k, v|
  new_data[k.first] ||= []
  new_data[k.first] << { k.last => v}
end

但是,如果您控制着数据库/查询,那么最好尽快以正确的格式从数据库中检索数据。

答案 1 :(得分:1)

您可以执行以下操作-

    new_data = { 'active' => [], 'inactive' => [] }
    data.each do |key, value|
      if key.first == 'active'
        new_data['active'] << { key.last => value }
      elsif key.first == 'inactive'
        new_data['inactive'] << { key.last => value }
      end
    end