2009-08-06 10 views
4

J'ai un modèle Post qui comprend un date_published. Je veux afficher des liens sur la page d'index pour voir tous les messages d'une certaine année (un peu comme où les blogs ont des mois que vous pouvez voir)Rails groupe par année problème

La seule façon dont je peux penser à revenir les années est en itérant sur tous des postes et de rendre un tableau unique des années que les postes tombent. Mais cela semble être un long chemin. Quelqu'un at-il une meilleure solution à cela? Peut-être serait-il plus facile de créer simplement une nouvelle table de sorte qu'un Post appartient à: l'année

Des suggestions?

Répondre

4

j'utiliser un de ces:

  • un find_by_sql pour obtenir les années distinctes, en utilisant toutes les fonctionnalités révélatrices ans est disponible dans votre base de données. Se résoudrait probablement contre un index, que je m'attendrais à ce que vous auriez;

ou

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

J'aime le second beaucoup, même si elle ne tient pas compte de la possibilité qu'une année peut avoir aucun message!

+0

Oui J'ai beaucoup réfléchi à votre deuxième option. Toujours se demandant si c'est la meilleure chose à faire. Merci – Cameron

3

Utilisez une recherche SQL du champ de date heure (dans mon exemple, il est 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") 

Ceci renverra toutes les valeurs de l'année sous la forme

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

years.each { |y| puts y['updated_at'] } 
2009 
2008 
1979 
1924 
9

Vous n'avez pas pour parcourir tous dans votre code Ruby. Vous pouvez utiliser l'option :group avec count:

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

Et puis construire les liens de cela.

+0

C'est vraiment cool. Je pourrais essayer ça. – Cameron

+0

Pour SQLlite, la syntaxe est 'Post.count (: all,: group =>" strftime ('% Y', date_published) ")'. Malheureusement, cela ne fonctionnera pas avec MySQL. – berkes