3

我的 Rails 3 应用程序中有很多文章。要将链接放在索引页面上,我如何在数组中获取所有可用年份(来自 created_at 属性)来执行类似这样的操作

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
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 回答