Rails итерация по массивам и хэш - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь повторить то, что я считаю хэшем в рельсах. Я использовал гем deep_pluck для получения значений модели, включая некоторые значения из ассоциаций. Как это:

    Continent.deep_pluck(:link_name, :name, 'countries' => [:link_name, :name])

это возвращает:

   [{"link_name"=>"europe", "name"=>"europe", "countries"=>[{"link_name"=>"countryname", "name"=>"countryname"}]}]

Я пытаюсь повторить это так:

             <% results.each do |continent| %>
              <% continent.each do |link_name, name, countries| %>
                <%= link_name %>
              <% end %>

            <% end %>

что взамен это:

                link_name
                name
                countries

Я перепробовал множество различных способов и методов, и до сих пор не могу получить желаемый вывод, который состоит в распечатке значений: link_name и: name, а также другого объекта стран, чтобы повторить их снова для их имени и т. Д. .

Я пытаюсь создать навигационное меню, в котором есть список каждого континента с подменю стран континента. Я использую pluck, потому что мне нужны только имена и link_names базы данных.

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Когда вы перебираете хеш, вы получаете доступ к ключам и значениям.

Если вы посмотрите на то, что печатается, вы получите ключи каждого хэша. Ваш вывод может иметь больше смысла, если вы установите параметры такими, какие они есть на самом деле.

<% results.each do |continent| %>
  <% continent.each do |key, value| %>
    <%= key %>
  <% end %>
<% end %>

Этого должно быть достаточно, чтобы продвинуться дальше. Чтобы достичь того, что вы хотите, вам нужно проверить каждый key и что-то сделать с value, основываясь на том, что ключ.

0 голосов
/ 02 ноября 2018

Большое спасибо за ваши предложения, мне наконец-то удалось заставить его работать так:

      <% results.each do |continent| %>
             <li class="has_children"><a href="/continents/<%= continent["link_name"] %>"><%= continent["name"] %></a>
              <ul class="sub_menu">
                <% continent["countries"].each do |country| %>
            <li><a href="/countries/<%= country["link_name"] %>"><%= country["name"] %></a>
                <% end %>


              </ul>

             </li>

            <% end %>
0 голосов
/ 02 ноября 2018

Возможно, попробуйте что-то вроде:

[{"link_name"=>"europe", "name"=>"europe", "countries"=>[{"link_name"=>"countryname", "name"=>"countryname"}]}].each do |continent|
  continent.each do |k,v|
    case k
    when 'countries'
      v.each do |country|
        country.each do |k,v| 
          puts "  - #{v}"
        end
      end
    else
      puts v
    end
  end
end

(Естественно, вам нужно добавить разметку erb. А "put" предназначены только для запуска этого в консоли.)

Что даст вам:

europe
europe
  - countryname
  - countryname
...