我正试图按字母顺序和块格式从我的数据库中显示标题列表。我想要输出字母,然后包括以该字母开头的所有标题。例如:
- A
- Apple
- anotherthing
- B
- Bob
titles.group_by {|word| word[0].upcase }
那么,如果:
titles = ['Apple', 'anothersomething', 'Bob']
然后:
grouped_titles = titles.group_by {|word| word[0].upcase }
=> {"A"=>["Apple", "anothersomething"], "B"=>["Bob"]}
为了确保排序正确性,您可以对生成的哈希进行排序,转换为数组:
grouped_titles = grouped_titles.sort_by{|k, v| k}
=> [["A", ["Apple", "anothersomething"]], ["B", ["Bob"]]]
<% grouped_titles.each do |initial_letter, titles| %>
-display stuff here-
<% end %>
.group
方法可以在数据库中完成),但是如果您已经在页面上显示了所有数据,则此方法应该可以正常工作。我认为@MrTheWalrus提出的解决方案是可行的,只要您正确地遍历列表以保持顺序,但我会提出一种替代方案,如果您的列表变得很长,它会更快一些。首先确保您的列表按顺序排列,就像您已经做的那样:
@titles = Title.order(:title)
然后视图中的迭代将如下所示:
<% cur_letter = nil %>
<% @titles.each do |t| %>
<% title_letter = t.name[0].capitalize.match(/[A-Z]/) ? t.name[0].capitalize : "#" %>
<% if title_letter != cur_letter %>
<% cur_letter = title_letter %>
<%= cur_letter %>
<% end %>
<%= t.name %>
<% end %>
我承认这段视图代码有点丑陋,但它允许你通过列表进行一次迭代,保持顺序,并且避免使用不太简单的group_by
操作。
("A".."Z")
和(0..9)
进行迭代。 - tsherif