Алфавитные списки с рубином на рельсах - PullRequest
1 голос
/ 19 июля 2010

Я создаю список, который будет отсортирован по алфавиту, и я ищу решение, чтобы получить результат базы данных и отсортировать его по алфавиту.

Любая помощь очень ценится!

Ответы [ 3 ]

4 голосов
/ 19 июля 2010

Опираясь на вышеупомянутых тэндуков, мне нравится:

Company.rb

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

view

<% # 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 голос
/ 19 июля 2010

Хм, если у вас есть список, который не слишком массивен, вы можете просто сделать это наивно, как:

(предполагается, что у вас есть модель 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
0 голосов
/ 20 июля 2010

Попробуйте это:

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. Вы также должны соответствующим образом изменить список итераций имени буквы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...