按姓氏组织联系人以在按字母顺序排列的列表中显示

时间:2012-11-20 20:50:00

标签: ruby-on-rails ruby

每个联系人都有first_name和last_name。在我的联系人索引中,我按ASC顺序显示了last_namecoped by last_name。这很好用,但我希望能做得更好。

我想在索引中创建一个有组织的列表,按照姓氏的第一个字母对联系人进行分组,我有点不知道如何完成这项工作。结果如下:

<div class="contacts" id="contact_list_a">
  <h2>A</h2>
  <div class="contact">John Abercrombie</div>
  <div class="contact">Julie Aloters</div>
</div>

<div class="contacts" id="contact_list_b">
  <h2>B</h2>
  <div class="contact">Harry Bronson</div>
  <div class="contact">Stevie Brussels</div>
</div>

...(continues)

由于我缺乏经验,到目前为止我只看到两个选项:

1)我可以为字母表中的每个字母创建一个变量,并在适当的位置添加联系人。这会给DB带来大量的调用(我在假设),而且控制器中丰富的变量看起来并不优雅。

2)我可以将模型中的所有联系人拉到一个变量中(我现在正在做的),然后在我的控制器中创建一个私有方法,它迭代数组并相应地分配新变量。这似乎仍然效率低下,但对我来说看起来更好#1。

您能否深入了解更好的方法?我正在使用Ruby 1.9.3和Rails 3.2.8。

1 个答案:

答案 0 :(得分:3)

一旦您将用户拉入,users,您可以将其与

分组
# creates a hash mapping first letter of last name to array of corresponding users
groups = users.group_by { |user| user.last_name[0].downcase }

在您的视图中,您可以按如下方式遍历哈希:

<% groups.each do |letter, contacts| %>
  <div class="contacts" id="contact_list_<%= letter %>">
  <h2>letter.upcase</h2>
    <% contacts.each do |contact| %>
      <div class="contact"><%= contact.full_name %></div>
    <% end %>
  </div>
<% end %>