2012-04-04 12 views
3

私は自分のレール3アプリで多くの記事を持っています。インデックスページにリンクを置くために、私は得ることができますどのように、アレイ内の(のcreated_at属性から)、利用可能なすべての年は(DBのquerysに関して)最小の労力でこれを行うにはどのようにこのRuby:レール3モデルですべての利用可能な年を得る方法

years.do | year | 
= link_to year, articles_path(:year => year) 

任意のアイデアのような何かをします?

挨拶、 エイドリアン

EDIT1:これは最高/最速ではないかもしれません。しかし、fl00rは私を思い出してくれました。

@years = [] 

Article.pluck(:created_at).each do | year | 
    @years << year.strftime("%Y") 
end 

@years = @years.uniq.reverse 

答えて

3

を述べたように、既存の答えの代わりにあなたが唯一の年の配列をしたい場合:

次のSQLクエリを生成
@years = Article.uniq.pluck("EXTRACT(YEAR FROM created_at)") 

SELECT DISTINCT EXTRACT(YEAR FROM created_at) FROM `articles` 
+0

かなりエレガント:) – fl00r

+0

です。まさに私が必要とするもの。そのためのthx! – adrian

0

この解決方法はデータベースに大きく依存しますが、速くなければなりません。

タイムスタンプcreated_atの日付部分で記事を選択するためのクラスメソッドを作成します。ここではSQLiteのための例です:

class Article 
    def self.by_year(year) 
    where(['strftime("%Y", created_at) = "?"', year]) 
    end 
end 

次に、あなたのコントローラは、このようにそのメソッドを呼び出すことができます。

@articles = Article.by_year(params[:year]) 

あなたのビューコードは(years.doyears.each doする必要があります)わずかな構文エラーがありますが、それ以外の、それはうまく見えます。

+0

迅速な回答ありがとうございます。しかし、私はあなたが間違っていると思う。私が必要とするのは記事の利用可能な日付の配列です。私は上記のコードのようなバーを表示して、その年に直接ジャンプしたいと思います。年に基づくページネーションと同じように。 – adrian

+0

あなたはそうです。私はその質問を誤解した。私はfl00rの答えはあなたが望むものを与えると信じています。おそらくあなたはモデルとコントローラで私の答えを使うことができます。 – Brandan

1
@years = Article.select("YEAR(created_at) as year").group("YEAR(created_at)").pluck(:year) 
@years.each do |year| 
    = link_to year, articles_path(year: year) 
end 

や、@sephは

@years = Article.select("DISTINCT YEAR(created_at) as year").pluck(:year) 
@years.each do |year| 
    = link_to year, articles_path(year: year) 
end 
+0

これはトリックを行う可能性があります。しかし、私はあなたのコードの最初の行の "間違った数の引数(1の0)"エラーを取得します。 – adrian

+1

それは 'group'ではなく' group_by'であり、group_byはActiveSupportの拡張です。少し混乱:) – lwe

+1

私のために働くことができませんでした。これはうまくいきました: 'Article.select("年と別個のYEAR(created_at) ")。map(&:year)' – seph

関連する問題