很抱歉这个新手问题,但我无法想象我怎么能这样做..
我有以下城市表
# Table name: cities
#
# id :integer
# name :string(255)
# country :string(255)
(注意:我没有使用单独的Country表,因为我使用Geokit-rails并认为将所有Google查询存储在同一个表中更简单。但是,通过单独的表来呈现我想要的内容会更容易一个belongs_to / has_many关联)
在我的城市/索引视图中,我想循环每个国家/地区的所有城市,以便呈现如下内容:
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?)
非常感谢!
答案 0 :(得分:3)
执行此操作的正确方法是使用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 :(得分:1)
我使用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>
输出:
答案 2 :(得分:0)
官方rails guides是一个很好的起点;)