У меня есть модель Post, которая включает дату_публикации. Я хочу отображать ссылки на странице указателя для просмотра всех сообщений определенного года (немного похоже на то, где блоги могут просматривать месяцы)
Единственный способ, которым я могу думать о возврате лет, - это перебирать все посты и возвращать уникальный массив лет, в которые посты попадают. Но это похоже на долгий путь. У кого-нибудь есть лучшее решение для этого? Может быть, было бы проще просто создать новую таблицу, чтобы сообщение принадлежало: год
Есть предложения?
Вам не нужно перебирать их все в вашем коде Ruby. Вы можете использовать опцию :group с count:
:group
count
>> Post.count(:all, :group => "Year(date_published)") => [["2005", 5], ["2006", 231], ["2007", 810], ["2009", 3]]
А затем создайте ссылки из этого.
Я бы использовал один из них:
find_by_sql
или
Post.minimum(:date_published).year..Post.maximum(:date_published).year
Мне очень нравится второй, хотя он не учитывает вероятность того, что год может не иметь постов!
Использовать 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