ruby-on-rails - 如何在 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>
解决方案
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,您就应该开始营业了!
推荐阅读
- javascript - 可粘贴的 div:粘贴在上下文菜单中消失,只能通过 ctrl+V 工作
- python - Pandas 数据框相等性测试
- python - 如何执行 python 类模块以及 pytest 和选项解析器?
- excel - 从 VB.NET 中的 Excel 文件读取时,OpenXML 返回数字而不是字符串
- python - 选择多个下拉菜单后刮
- mysql - Mysql IF 语句检查多个可能为空的值
- ios - XML API调用不适用于ionic3中的cordova-plugin-advanced-http最新版本
- angular - 无休息呼叫的角后端服务呼叫
- c# - 放大组合框未按预期工作
- mysql - Google Cloud SQL 是否支持 MySQL 的 ON CASCADE DELETE 功能?