[英]How do I Loop through an Hash in a Ruby Array
我使用group_by
来获得某个想要的结果。 根据答案中的解释,我更新了我的问题以反映答案,查看达成解决方案所采取的步骤,查看编辑历史记录。
@grouped_test_specific_reports = TestSpecificReport.all.group_by(&:equipment_type_name)
上面的代码产生了这个结果:
2.5.1 :026 > pp @grouped_test_specific_reports
{"Ultrasonic Probes"=>
[#<TestSpecificReport:0x00007f832aa2d6e0
id: 10,
equipment_type_id: 2,
test_method_id: 1,
equipment_amount: "Multiple",
equipment_heading: "UT Probes">],
"Ultrasonic Instruments"=>
[#<TestSpecificReport:0x00007f832aa2d3c0
id: 8,
equipment_type_id: 1,
test_method_id: 1,
equipment_amount: "Single",
equipment_heading: "UT Instrument">],
"Visual Test Equipment"=>
[#<TestSpecificReport:0x00007f832aa2cfb0
id: 11,
equipment_type_id: 4,
test_method_id: 1,
equipment_amount: "Single",
equipment_heading: "VT Equipment">]}
=> {"Ultrasonic Probes"=>[#<TestSpecificReport id: 10, equipment_type_id: 2, test_method_id: 1, equipment_amount: "Multiple", equipment_heading: "UT Probes">], "Ultrasonic Instruments"=>[#<TestSpecificReport id: 8, equipment_type_id: 1, test_method_id: 1, equipment_amount: "Single", equipment_heading: "UT Instrument">], "Visual Test Equipment"=>[#<TestSpecificReport id: 11, equipment_type_id: 4, test_method_id: 1, equipment_amount: "Single", equipment_heading: "VT Equipment">]}
我的下一个目标是在浏览器中按关键字列出分组的测试特定报告,我可以通过@grouped_test_specific_reports.each { |key, value| puts key }
来做到这一点@grouped_test_specific_reports.each { |key, value| puts key }
@grouped_test_specific_reports.each { |key, value| puts key }
现在我们必须在另一个循环中迭代这些值,它恰好是一个数组,以便能够比较equipment_amount
。
带有equipment_amount: "Multiple"
的值前面会有加号图标,带有equipment_amount: "Single"
只是一个下拉列表:
这是 UI 的代码:
- @grouped_test_specific_reports.each do |equipment_type_name, test_specific_reports|
.form-group.row
.col-sm-6
%label
= equipment_type_name
= select_tag '', options_from_collection_for_select(test_specific_reports, :id, :equipment_heading), { include_blank: "Select #{equipment_type_name} List", class: 'form-control select2', style: 'width: 100%;' }
.col-sm-1
- test_specific_reports.each do |test_specific_report|
- if test_specific_report.equipment_amount == 'Multiple'
.icon.text-center
%i.fa.fa-plus-circle.add-icon
我个人觉得你问的问题有点不清楚。 为此,我在评论中与您讨论了一些事情。 从我们在评论中的讨论来看,您似乎只是想遍历每个组的分组值。
首先,我想弄清楚group_by
到底做了什么,因为这似乎是问题所在。 对您当前工作的简单误解。
group_by { |对象| 块 } → a_hash
group_by → an_enumerator
按块的结果对集合进行分组。 返回一个散列,其中键是块的计算结果,值是集合中与键对应的元素数组。
如果没有给出块,则返回一个枚举器。
(1..6).group_by { |i| i%3 } #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}
文档清楚地表明分组散列具有从块(返回值)评估的键。 属于键的值实际上是评估为相同结果的值列表。 这意味着您可以通过以下方式简单地遍历这些值。
grouped_values = (1..6).group_by { |n| n % 3 }
grouped_values.each do |key, values|
puts "Key: #{key}"
values.each do |value|
puts "Value: #{value}"
end
end
第each
循环遍历组。 第二each
回路通过所述组的值。 由于您循环处理两个不同的内容,因此您无法轻松将其更改为单个循环。 这里要记住的重要一点是,属于组键的值不是单个值,而是一组值(数组)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.