簡體   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