3

Rails 3アプリにはたくさんの記事があります。インデックス ページにリンクを配置するには、次のようなことを行うために (created_at 属性から) 利用可能なすべての年を配列に取得するにはどうすればよいですか?

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

(DBクエリに関して)最小限の労力でこれを行う方法はありますか?

ご挨拶、 エイドリアン

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

@years = []

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

@years = @years.uniq.reverse
4

3 に答える 3

3

一連の年のみが必要な場合の既存の回答の代替:

@years = Article.uniq.pluck("EXTRACT(YEAR FROM created_at)")

次のSQLクエリを生成します。

SELECT DISTINCT EXTRACT(YEAR FROM created_at) FROM `articles`
于 2012-04-04T15:43:42.043 に答える
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
于 2012-04-04T14:34:45.277 に答える
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.doである必要がありますyears.each do) が、それ以外は問題ないようです。

于 2012-04-04T14:33:56.183 に答える