按字母顺序列表与铁轨上的红宝石

时间:2010-07-19 19:23:33

标签: ruby-on-rails list

我正在构建一个按字母排序的列表,我正在寻找一个解决方案来获取数据库结果并按字母顺序排序。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

基于上面的结果,我喜欢:

Company.rb

def initial
  return '?' if name.blank?
  # name.[0].upcase (updated to get the first character )
  name.slice(1).chr.upcase
end

视图

<% # Company.all.group_by(&initial) do |initial, companies| (updated) %>

<% Company.all.group_by(&:initial).each do |initial, companies| %>
  <%= content_tag(:h2, initial)%>
  <% companies.each do |company|%>
    <%= link_to(company.name, company%>
  <% end %>
<% end %>

答案 1 :(得分:1)

嗯,如果你有一个不太大的列表,你可能只是天真地做:

(假设您的模型Company具有name属性)

@grouped = {}
Company.all.each do |company|
  letter = company.name.slice(0,1).upcase
  @grouped[letter] ||= []
  @grouped[letter] << company
end

现在,您可以在以下情况下执行以下操作:

<ul>
  <% @grouped.keys.sort.each do |letter| -%>
    <li>
      <h2><%= letter %></h2>
      <ul>
        <% @grouped[letter].each do |company| -%>
          <li><%= company.name %></li>
        <% end -%>
      </ul>
    </li>
  <% end -%>
</ul>

更新:如果你想扩展“字母”的逻辑,你可能会将逻辑移到模型中,例如:

class Company
  # ... code

  def initial
    # find a number at the start of the string if it exists
    m = self.name.match(/^\d+/)
    return m[0] if m
    # or return the first letter upcased otherwise
    return self.name.slice( 0, 1 ).upcase
  end
end

答案 2 :(得分:0)

试试这个:

g = Company.all.group_by{|c|c.name.upcase[0..0]}
('A'..'Z').each do |letter|
  companies = g[letter] || []
  # process the name and the letter
end

即使在没有少数字母的项目的情况下,这也会有用。

注意:您可能希望通过修改group_by逻辑来区别对待数字和非英文字母。您还必须相应地更改字母名称迭代列表。