按字母顺序列表与铁轨上的ruby
我正在构建一个将按字母表排序的列表,我正在寻找一个解决方案来获取数据库结果并按字母顺序对其进行排序。
任何帮助是极大的赞赏!
嗯,如果你有一个不太大的列表,你可能只是天真地做:
(这假设您有一个具有name
属性的model Company
)
@grouped = {} Company.all.each do |company| letter = company.name.slice(0,1).upcase @grouped[letter] ||= [] @grouped[letter] << company end
现在,在您看来,您可以执行以下操作:
<% @grouped.keys.sort.each do |letter| -%> -
<%= letter %>
<% @grouped[letter].each do |company| -%> - <%= company.name %>
<% end -%>
<% end -%>
更新 :如果您想扩展“字母”的逻辑,您可能会将逻辑移到模型中,例如:
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
在上面的结果基础上,我喜欢:
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 %>
试试这个:
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逻辑来区别对待数字和非英文字母。 您还必须相应地更改字母名称迭代列表。