Rails - 为循环的每次迭代从表中获取数据

时间:2011-05-18 23:09:03

标签: ruby-on-rails-3 each

很抱歉这个新手问题,但我无法想象我怎么能这样做..

我有以下城市表

# 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?)

非常感谢!

3 个答案:

答案 0 :(得分:3)

执行此操作的正确方法是使用Countryid创建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>

输出:

  • 美国
    • 纽约
    • 旧金山
    • 洛杉矶
  • United Kingdon
    • 伦敦
  • 西班牙
    • 马德里
    • 巴塞罗那

答案 2 :(得分:0)

官方rails guides是一个很好的起点;)