2010-12-12 61 views
0

J'utilise Rails pour un moteur de blog. J'implémente une fonction d'archivage qui est basée sur des mois et des années uniques où un article a été publié.Sélection de dates distinctes pour une archive de blog

est ici la fonction de concombre:

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 

J'ai du mal à comprendre la meilleure approche pour cela. Dois-je aller hardcore avec une requête SQL et si oui, comment cela ressemblerait-il? (En utilisant PostgreSQL)

Ou y a-t-il une façon de le faire en douceur en utilisant simplement Rails pur?

+1

l'aide d'une requête SQL serait " hardcore "? – araqnid

Répondre

2

La façon pur Ruby:

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

Ce qui sera une lourde charge si vous avez beaucoup de messages. Ainsi, vous pouvez le faire dans SQL:

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

Remplacez le foo quelque chose à formater la date (je ne sais pas comment faire cela par cœur, de sorte que vous aurez à regarder que vous)

0

Avec postgresql, j'ai trouvé l'utilisation de la méthode date_trunc la plus utile.

par exemple:

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

Je l'ai trouvé est également judicieux d'utiliser la AT TIME ZONE construction pour convertir la date à votre fuseau horaire local avant de faire la troncature:

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