2011-05-18 65 views
0

对不起,这个新手的问​​题,但我不明白我怎么能做到这一点..导轨 - 从表中获取数据的一个循环的每次迭代

我有以下City表

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

(注意:我没有使用单独的国家/地区表格,因为我使用Geokit-rails,并认为将所有Google查询存储在同一个表格中更简单。但是,通过belongs_to/has_many将单独的表格呈现为我想要的样式会更容易协会)

在我的城市/指数视图我想lo运算都是为了使像城市的每个国家:

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

正确的方式做,这是创建一个Countryidname并在City模型只要保持country_id到全国,而不是字符串

所以

class Country < ActiveRecord::Base 
    has_many :cities 
end 

class City < ActiveRecord::Base 
    belongs_to :country 
end 

,那么你可以调用Country.includes(:cities)和遍历他们这样y中我们的观点:

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

如果你还是想用自己的方式,你可以不喜欢与group_by方法

@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

我已经成功:

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

输出:

  • 美国
    • 纽约
    • 圣Francisco
    • 洛杉矶
  • 美登
    • 伦敦
  • 西班牙
    • 马德里
    • 巴塞罗那
相关问题