Rails 3如何按字母顺序列出ActiveRecord对象

4
4个回答

15

您需要像这样做:

@users = User.all.group_by{|u| u.name[0]}
在视图中:
<% @users.keys.sort.each do |starting_letter| %>
  <%= starting_letter %>
  <% @users[starting_letter].each do |user| %>
    <%= user.name %>
  <% end %>
<% end %>

你如何创建一个链接,以显示所有以“F”开头的用户,并在单独的页面上显示它们? - Lee McAlilly

6

从数据库中获取所有联系人并在数组上使用enum.group_by方法:

@contacts = Contact.order(:name)
@contacts.group_by{ |contact| contact.name[0] }.each do |contact|
  # ...
end

很棒的答案,谢谢。实际上这种方法是可行的,但在我的实现中,我需要嵌套视图循环,“按起始名称”和“按联系人名称”,因为JQuery mobile将首字母和对象名称作为不同的CSS类。 - Harry

1
当我进行字母排序时,我会创建一个单独的列(例如first_letter)来保存名称的第一个字母,或者在第一个字符不是字母时使用“#”。 (通常我只在一次只显示一个字母时这样做,因此如果您没有按第一个字母查询,则可能过度了。)
您的控制器代码将如下所示:@contacts = Contact.all.order('first_letter, name').group_by(&:first_letter) 一个简单的(HAML)视图可能看起来像这样(我没有快速看到jQuery mobile想要什么类型的输出):
- (['#'] + ('A'..'Z').to_a).each do |letter|
  %h2 #{letter}
  %ol
    - if !@contacts[letter].empty?
      - @contacts[letter].each do |contact|
        %li #{contact.name}

0

我相信这会让你回家,除非我误解了你的意思...

@contacts.order(:name).group(:name)

目前 @contacts 并不是结果列表,而只是一个迭代器,当您首次尝试使用它来获取结果(.each、.count 等)时,它将执行 SQL。

这里有一个关于这个领域的非常棒的指南:ActiveRecord 查询


这将在SQL查询中添加一个GROUP BY子句。这将导致具有相同“名称”的记录除第一个之外的所有记录被忽略,这不是目标。 - coreyward
我完全误解了 :P 我想我从不半途而废。回想起来,Semyon的答案是正确的选择。 - user483040

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接