Как мне перебрать хэш в массиве Ruby - PullRequest
0 голосов
/ 30 декабря 2018

Я использовал 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 }

  • "VisualИспытательное оборудование "
  • " Ультразвуковые приборы "и
  • " Ультразвуковые зонды "

Теперь нам нужно перебрать значения, которые являются массивом, вдругой цикл для сравнения equipment_amount.

Значения с equipment_amount: "Multiple" будут иметь значок плюс перед ними, а значения с equipment_amount: "Single" будут просто выпадающим:

Вот код для интерфейса:

- @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

1 Ответ

0 голосов
/ 30 декабря 2018

Я лично нашел вопрос, который вы задаете, немного неясным.По этой причине я обсуждал некоторые вещи в комментариях с вами.Из нашего обсуждения в комментариях показалось, что вы просто хотели пройтись по группированным значениям для каждой группы.

Сначала я хочу выяснить, что именно делает group_by, потому что это казалосьбыть проблемой.Простое недопонимание того, над чем вы сейчас работаете.

group_by {| obj |block} → 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 перебирает значения группы.Поскольку вы зацикливаете две разные вещи, вы не можете легко изменить это в один цикл.Важно помнить, что значение, принадлежащее ключу группы, является не единственным значением, а группой значений (массивом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...