2

每个联系人都有一个名字和姓氏。在我的联系人索引中,我按 ASC 顺序显示了一个按姓氏命名的 default_scoped 列表。这工作正常,但我希望让它变得更好。

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

<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)我可以为字母表中的每个字母创建一个变量,并在每个合适的地方添加联系人。这会产生对数据库的大量调用(我假设),并且我的控制器中的大量变量似乎一点也不优雅。

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

您能否深入了解一种更好的方法来做到这一点?我正在使用 Ruby 1.9.3 和 Rails 3.2.8。

4

1 回答 1

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 %>
于 2012-11-20T21:12:37.710 回答