Как мне сделать группировку по годам? - PullRequest
3 голосов
/ 23 марта 2010

У меня есть модель книги со столбцом типа даты с именем publish_date. С моей точки зрения, я перебираю книги и хочу сгруппировать книги по годам так, чтобы у меня был заголовок на каждый год, а книги, которые были опубликованы в этом году, должны быть указаны под заголовком года.

Таким образом, начиная с «2010», будут перечислены все книги, опубликованные в 2010 году, затем другой заголовок «2009», в котором будут перечислены все книги, опубликованные в 2009 году, и т. Д.

<% @all_books.each do |book| %>
   <%=link_to book.title + ", (PDF, " + get_file_size(book.size) + ")" %>
<% end %>

Создавая book.publish_date.strftime ("% Y"), я могу узнать год, но не знаю, как сгруппировать записи по годам. Буду признателен за любую помощь в этом.

Ответы [ 4 ]

6 голосов
/ 23 марта 2010

Вы можете использовать group_by (см. API ) как (в верхней части моей головы

)
<% @all_books.group_by(&:year).each do |year, book| %>

   ...
<% end %>
3 голосов
/ 23 марта 2010
def year
  self.created_at.strftime('%Y')
end

< % @all_books.group_by(&:year).each do |year, book| %>

Year < %= year %>
# render books here

< % end %>

Что скажете?

2 голосов
/ 23 марта 2010

Вы можете использовать group_by для удобства, но ваши потребности могут быть лучше удовлетворены, полагаясь на БД для сортировки и цикл each. Это позволяет избежать затрат на сортировку на стороне клиента и манипулирование хешами для группировки.

Где-то в вашем контроллере

@all_books = Book.all(:order => "publish_date DESC")

По вашему мнению

<%year = nil
  @all_books.each do |book| 
    if year.nil? or year > book.publish_date.year 
      year = book.publish_date.year 
%>
      <h1> <%=year%><h1>
  <%end % >
  <%=link_to book.title + ", (PDF, " + get_file_size(book.size) + ")" %>
<%end %>
1 голос
/ 23 марта 2010

Быстрый и грязный подход состоит в том, чтобы просто группировать по годам и повторять их:

@all_books.group_by { |b| b.created_at.year }.each do |year, books|
  # All books for one year, so put heading here
  books.each do |book|
    # ...
  end
end

Это требует сортировки в приложении Rails, поэтому вам нужно будет извлечь все соответствующие записи, чтобы данные были правильно организованы. Чтобы выполнить сортировку на сервере, вам, вероятно, потребуется ввести столбец года и синхронизировать его со временем create_at.

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