Выбор отдельных дат для архива блога - PullRequest
0 голосов
/ 12 декабря 2010

Я использую Rails для движка блога.Я реализую функцию архивирования, которая архивирует, основываясь на уникальном месяце и годах, когда публикация была опубликована.

Вот функция огурца:

  Scenario: Displaying an archive menu from distinct posts months and years 
   Given the following posts exists for the blog "Blondinbella":
         | Title           | Published at          |
         | Redbull         | 1 March 2010 11:00    |
         | Tuesday outfit  | 2 January 2010 11:00  |
         | Monday outfit   | 1 January 2010 11:00  |
         | Another outfit  | 1 December 2009 11:00 |
    When I visit the blog "Blondinbella"
    Then I should see "March 2010" in the archive menu
     And I should see "January 2010" in the archive menu
     And I should see "December 2009" in the archive menu
     But I should not see "February 2010" in the archive menu

Мне трудно разобратьсялучший подход для этого.Должен ли я пойти на хардкор с SQL-запросом, и если да, то как это будет выглядеть?(Использование PostgreSQL)

Или есть способ сделать это плавно, просто используя чистый Rails?

Ответы [ 2 ]

2 голосов
/ 12 декабря 2010

Чистый Рубиновый путь:

Post.all.group_by { |post| post.published_at.strftime("%B %Y") }.map { |group| group.first.strftime("%B %Y") }

Что будет большим грузом, если у вас много постов. Так что вы можете сделать это в SQL:

Post.select("DISTINCT foo AS month").map(&:month)

Замените foo на что-то для форматирования даты (я не знаю, как это сделать наизусть, так что вам придется поискать это самому)

0 голосов
/ 03 октября 2013

С postgresql я нашел наиболее полезным использование метода date_trunc.

например:

Post.select("DISTINCT date_trunc('month', published_at) as month").collect(&:month)

Я также обнаружил, что имеет смысл использовать конструкцию AT TIME ZONE для преобразования даты в местный часовой пояс перед выполнением усечения:

Post.select("DISTINCT date_trunc('month', published_at AT TIME ZONE 'NZST') as month").collect(&:month)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...