2009-08-06 9 views
4

私は、date_publishedを含む投稿モデルを持っています。インデックスページにリンクを表示して、特定の年のすべての投稿を表示したい(ブログには閲覧可能な月があるようなビット)年ごとのグループの問題

私が年を返すと考えることができる唯一の方法は、ポストの数々のユニークな配列を返します。しかし、これは長い道のりのようです。誰にもこれに対するよりよい解決策がありますか?たぶん、新しいテーブルを作成するほうが簡単かもしれません。年は

どのような提案ですか?

答えて

4

私はこれらのいずれかを使用したい:find_by_sql

  • を別々の年を取得するには、年間の暴露の機能は、データベースで利用可能であるものは何でも使って。私はあなたが期待していたインデックスに対しておそらく解決するでしょう。

または

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

私はそれが今年は何の投稿がありませんかもしれない可能性を考慮していないにも関わらず、二番目に多くのことを好き!

+0

私はあなたの第2の選択肢について多く考えました。それが最善のことであれば、まだ熟考しています。おかげで – Cameron

3

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

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

必要はありません

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のがある)、日付時刻フィールドのSQL検索を使用しますあなたのRubyコードでそれらのすべてを反復処理します。

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

そしてそれからリンクを構築:あなたはcount:groupオプションを使用することができます。

+0

それはかなりクールです。それを試みるかもしれない。 – Cameron

+0

SQLliteの構文は 'Post.count(:all、:group =>" strftime( '%Y'、date_published) ")'です。残念ながら、それはMySQLでは動作しません。 – berkes

関連する問題