Рельсы группируются по годам - PullRequest
4 голосов
/ 06 августа 2009

У меня есть модель Post, которая включает дату_публикации. Я хочу отображать ссылки на странице указателя для просмотра всех сообщений определенного года (немного похоже на то, где блоги могут просматривать месяцы)

Единственный способ, которым я могу думать о возврате лет, - это перебирать все посты и возвращать уникальный массив лет, в которые посты попадают. Но это похоже на долгий путь. У кого-нибудь есть лучшее решение для этого? Может быть, было бы проще просто создать новую таблицу, чтобы сообщение принадлежало: год

Есть предложения?

Ответы [ 3 ]

9 голосов
/ 06 августа 2009

Вам не нужно перебирать их все в вашем коде Ruby. Вы можете использовать опцию :group с count:

>> Post.count(:all, :group => "Year(date_published)")
=> [["2005", 5], ["2006", 231], ["2007", 810], ["2009", 3]]

А затем создайте ссылки из этого.

4 голосов
/ 06 августа 2009

Я бы использовал один из них:

  • a find_by_sql, чтобы получить отчетливые годы, используя все доступные в вашей базе данных функции по выявлению годов. Скорее всего, сопоставится с индексом, который, как я ожидаю, вы получите;

или

  • Post.minimum(:date_published).year..Post.maximum(:date_published).year

Мне очень нравится второй, хотя он не учитывает вероятность того, что год может не иметь постов!

3 голосов
/ 06 августа 2009

Использовать SQL-поиск поля даты и времени (в моем примере это updated_at)

years = ActiveRecord::Base.connection.select_all("SELECT DISTINCT DATE_FORMAT(updated_at, '%Y') AS updated_at FROM posts ORDER BY updated_at DESC")

Это вернет все значения года в форме

[{"updated_at"=>"2009"}, {"updated_at"=>"2008"}, {"updated_at"=>"1979"}, {"updated_at"=>"1922"}]

 years.each { |y| puts y['updated_at'] }
 2009
 2008
 1979
 1924
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...