繁体   English   中英

如何创建带有哈希的分组哈希数组而不是Rails中的ActiveRecord的选择列表?

[英]How can I create a select list with grouped hash array of hashes instead of ActiveRecord in Rails?

我试图找出如何从具有哈希数组的哈希中显示分组列表。 我正在从另一个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://website.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>

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,您应该可以经营业务!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM