首页 > 解决方案 > 如何在 Rails 中创建一个包含分组哈希数组而不是 ActiveRecord 的选择列表?

问题描述

我正在尝试整理如何从带有哈希数组的哈希中呈现分组列表。我正在从另一个 api 源获取信息并转换 JSON,然后按区域分组。

@list ||= JSON.parse(@conn.get('/templates').body, symbolize_names: true)

@template_list = (@list.group_by {|k,v| k[:region]})

@template_list 输出如下所示。

{"EMEA"=>[{:id=>"1563", :url=>" https://website.com ", :name=>"TemplateNameA", :region=>"EMEA", :another_key=> "另一个值", :contain_count=> 0}, {:id=>"7819", :url=>" https://website.com ", :name=>"TemplateNameB", :region=>"EMEA" , :another_key=>"另一个值", :contain_count=>0}], "Central"=>[{:id=>"421", :url=>" https://website.com ", :name= >"TemplateNameA", :region=>"Central", :another_key=>"另一个值", :contain_count=>0}], "East"=>[{:id=>"12", :url=>" https://网站。com ", :name=>"TemplateName1", :region=>"East", :another_key=>"另一个值", :contain_count=>0}]}

经过几次迭代后,最接近我想要的结果的是 <%= select_tag :template_id, grouped_options_for_select(@template_list) %>

这导致提取所有键/值对而不是一个不错的短列表。我想要的输出如下所示。

<optgroup label="East">
  <option value="12">TemplateName1</option>
  <option value="321">TemplateName2</option>
</optgroup>
<optgroup label="EMEA">
  <option value="1563">TemplateNameA</option>
  <option value="7819">TemplateNameB</option>
  <option value="2367">TemplateNameC</option>
</optgroup>
<optgroup label="Central">
  <option value="421">TemplateNameA</option>
</optgroup>

标签: ruby-on-rails

解决方案


grouped_options_for_select 需要一个看起来像这样的哈希:

{
  'group name 1': [
    [select name, select value],
    [select name, select value]
  ], 
  'group name 2': [
    [select name, select value],
    [select name, select value]
  ]
}

所以我们只需要把你的原始数据结构转换成这种格式:

@data = {"EMEA"=>[{:id=>"1563", :url=>"https://website.com", :name=>"TemplateNameA", :region=>"EMEA", :another_key=>"another value", :contain_count=> 0}, {:id=>"7819", :url=>"https://website.com", :name=>"TemplateNameB", :region=>"EMEA", :another_key=>"another value", :contain_count=>0}], "Central"=>[{:id=>"421", :url=>"https://website.com", :name=>"TemplateNameA", :region=>"Central", :another_key=>"another value", :contain_count=>0}], "East"=>[{:id=>"12", :url=>"https://website.com", :name=>"TemplateName1", :region=>"East", :another_key=>"another value", :contain_count=>0}]}
@options = {}
@data.each do |name,data|
    @options[name] = data.collect do |x|
      [x[:name], x[:id]]
    end
end

这会遍历所有原始哈希键,然后为每个数组元素创建一个新数组,只保留名称和 id。

然后将@options 传递给grouped_options_for_select,您就应该开始营业了!


推荐阅读