Как я могу создать список выбора с сгруппированным массивом хешей вместо ActiveRecord в Rails? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь разобраться, как представить сгруппированный список из хэша с массивом хэшей. Я получаю информацию из другого источника 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 => "другой значение ",: contains_count => 0}, {: id =>" 7819 ", : url => "https://website.com",: name =>" TemplateNameB ",: region =>" EMEA ", : another_key => «другое значение»,: contains_count => 0}], "Central" => [{: id => "421",: url => "https://website.com", : name => "TemplateNameA",: region => "Central",: another_key => "another значение ",: contains_count => 0}]," East "=> [{: id =>" 12 ", : url => "https://website.com",: name =>" TemplateName1 ",: region =>" East ", : another_key => «другое значение»,: contains_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>

1 Ответ

0 голосов
/ 11 сентября 2018

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

Это перебирает все ваши оригинальные ключи Hash, а затем создает новый массив для каждого элемента массива, сохраняя только имя и идентификатор.

Затем передайте @options в grouped_options_for_select, и вы должны быть в бизнесе!

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