Rails - получение данных из таблицы для каждой итерации цикла - PullRequest
0 голосов
/ 19 мая 2011

Извините за этот вопрос новичка, но я не могу понять, как я могу это сделать ..

У меня есть следующая таблица городов

# Table name: cities
#
#  id          :integer
#  name        :string(255)
#  country     :string(255)

(примечание: я не использую отдельную странуя использую Geokit-rails и думаю, что проще хранить все запросы Google в одной таблице. Однако было бы проще иметь отдельные таблицы для рендеринга того, что я хочу, через ассоциацию own_to / has_many)

Inмой вид города / индекса Я хочу зациклить все города для каждой страны, чтобы отобразить что-то вроде:

United States
  New York
  San Francisco
  Los Angeles
United Kingdom
  London
Spain
  Madrid
...

К настоящему времени я могу получить только то, что предоставлено с помощью строительных лесов

Модель

def index
  @cities = City.all
end

Вид

<table>
  <% for city in @cities %>
  <tr>
    <th><%= city.country %></th>    
  </tr>
  <tr>
    <td><%= city.name %></td>
  </tr>
    <% end %>
</table>

Визуализация:

United States
  Los Angeles
United States
  New York
...

Я не нашел ни одного ресурса по этому поводу.Я был бы рад, если бы кто-то мог помочь мне (я не знаю, с чего мне начинать: find_by_ / params / each или collection?)

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

Ответы [ 3 ]

3 голосов
/ 19 мая 2011

Правильный способ сделать это - создать таблицу Country с id и name, а в вашей модели City просто сохранить country_id для страны вместо строки

так

class Country < ActiveRecord::Base
  has_many :cities
end

class City < ActiveRecord::Base
  belongs_to :country
end

тогда вы можете позвонить Country.includes(:cities) и выполнить итерацию по ним следующим образом:

<% for country in countries %>
  <%= country.name %>
  <% for city in country.cities %>
    <%= city.name %>
  <% end %>
<% end %>

Если вы все еще хотите использовать свой способ, вы можете сделатьчто-то вроде

@cities = City.order("country asc")
@countries = @cities.map(&:country).uniq!

<% for country in @countries %>
  <%= country.name %>
  <% for city in @cities %>
    <%= city.name if city.country == country %>
  <% end %>
<% end %>
1 голос
/ 19 мая 2011

У меня был успех с group_by методом:

@cities.group_by(&:country).each do |country, cities|
  puts country.name
  cities.each do |city|
    puts "-> #{city.name}"
  end
end

Выход:

United States
-> New York
-> San Francisco
-> Los Angeles
United Kingdom
-> London
Spain
-> Madrid
-> Barcelona

Конечно, вы, вероятно, будете делать это в шаблоне erb, но идея та же:

<ul>
    <% @cities.group_by(&:country).each do |country, cities| %>
        <li><%= country.name %></li>
        <li>
            <ul>
                <% cities.each do |city| %>
                    <li><%= city.name %></li>
                <% end %>
            </ul>
        </li>
    <% end %>
</ul>

Выход:

  • США
    • Нью-Йорк
    • Сан-Франциско
    • Лос-Анджелес
  • Юнайтед Кингдон
    • Лондон
  • Испания
    • Мадрид
    • Барселона
0 голосов
/ 19 мая 2011

Официальные направляющие рельсов - отличное место для старта;)

...