Ruby on rails 使用group_by但返回哈希数组

Ruby on rails 使用group_by但返回哈希数组,ruby-on-rails,ruby,Ruby On Rails,Ruby,我只想按城市所在的州对城市进行分组,然后让散列键数组(即州名)返回一个与城市相关的散列数据数组。现在我有这样的事情: City.all.group_by { |c| c.state.name } 将返回: { "Illinois": [# < City id: 3, name: "Chicago", state_id: 3 > ], "Texas": [# < City id: 2, name: "Houston", state_id: 2 > ], "Ca

我只想按城市所在的州对城市进行分组,然后让散列键数组(即州名)返回一个与城市相关的散列数据数组。现在我有这样的事情:

City.all.group_by { |c| c.state.name }
将返回:

{
  "Illinois": [# < City id: 3, name: "Chicago", state_id: 3 > ],
  "Texas": [# < City id: 2, name: "Houston", state_id: 2 > ],
  "California": [# < City id: 1, name: "Los Angeles", state_id: 1 > ],
  "New York": [# < City id: 4, name: "New York City", state_id: 4 > ]
}
{
“伊利诺伊州”:[#,
“德克萨斯州”:[#<城市id:2,名称:“休斯顿”,州id:2>,
“加利福尼亚州”:[#<城市id:1,名称:“洛杉矶”,州id:1>,
“纽约”:[#<城市id:4,名称:“纽约市”,州id:4>]
}

注意它是如何返回rails对象数组的。相反,我想返回一个具有特定属性的散列数组,比如它们的
id
name

这应该足够了

City.all.group_by { |c| c.state.name }.map {|k,v| [k, v.attributes] }.to_h
若要仅选择指定的属性,请执行以下操作:

v.attributes.slice(:name, :id)

这对你来说应该足够了

City.all.group_by { |c| c.state.name }.map {|k,v| [k, v.attributes] }.to_h
若要仅选择指定的属性,请执行以下操作:

v.attributes.slice(:name, :id)

分组值是Rails对象(您的模型)的原因是您也从这些对象开始。您可以使用该方法以散列形式检索模型实例的属性

以下操作可实现您想要的结果:

City.all.group_by { |city| city.state.name }
  .transform_values { |cities| cities.map(&:attributes) }
如果只需要特定属性,请改用:


请注意,
slice
将返回一个实例。它通常可以与普通散列相同的方式使用,但是对于
hash[:name]
hash['name']
返回相同的值。如果您更愿意使用普通散列,请在
切片
调用之后追加一个调用。

分组值之所以是Rails对象(您的模型),是因为您也从这些对象开始。您可以使用该方法以散列形式检索模型实例的属性

以下操作可实现您想要的结果:

City.all.group_by { |city| city.state.name }
  .transform_values { |cities| cities.map(&:attributes) }
如果只需要特定属性,请改用:


请注意,
slice
将返回一个实例。它通常可以与普通散列相同的方式使用,但是对于
hash[:name]
hash['name']
返回相同的值。如果您更愿意使用普通散列,请在
切片
调用之后追加调用。

您当前使用数组作为接收器调用
属性
,因为每个值都是一个城市数组。导致出现
命名错误
。此外,您的
切片(:name,:id)
应该是
切片('name',id')
,因为
属性
返回一个散列,其中键是字符串,而不是符号。您当前使用数组作为接收器调用
属性
,因为每个值都是一个城市数组。导致出现
命名错误
。此外,您的
切片(:name,:id)
应该是
切片('name',id')
,因为
属性
返回一个散列,其中键是字符串,而不是符号。为什么要用散列而不是模型实例?@Stefan我想稍后将数据导出为json。您可能想看看有趣的内容。它也会按照我想要的方式对它们进行分组?您仍然需要自己(在控制器中)对数据进行分组。但是您不必准备一个表示整个JSON结果的巨大哈希。相反,您有一个很好的DSL来定义JSON(在您的视图中)。为什么要使用哈希而不是模型实例?@Stefan我想稍后将数据导出为JSON。您可能想看看有趣的。它也会按照我想要的方式对它们进行分组?您仍然需要自己(在控制器中)对数据进行分组。但是您不必准备一个表示整个JSON结果的巨大哈希。相反,您有一个很好的DSL来定义JSON(在您的视图中)。