Хм, если у вас есть список, который не слишком массивен, вы можете просто сделать это наивно, как:
(предполагается, что у вас есть модель 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