我正在尝试为包含非常标准的存档信息的博客构建一个侧边栏,例如:
2013 年 8 月:3 个帖子
2013 年 7 月:5 个帖子
2013 年 6 月:4 个帖子
...ETC
什么 ActiveRecord 查询将提供这些按时间倒序排序的信息 ( month
, year
, )?count
Post 模型非常简单—— title
, body
, created_at
,modified_at
列。我正在尝试编写 ActiveRecord/Postgres 查询,该查询为我提供按月和年分组的帖子数(如上所列)。以下查询成功地做到了这一点:
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month')
但是我想明确地按时间顺序对列进行排序(所以 2013 年 8 月在列表中高于 2013 年 7 月),这就是一切都变得混乱的地方。我尝试了以下查询失败,只是为了开始:
Post.select('count(*) as count','extract(year from created_at) as year', 'extract(month from created_at) as month').group('year','month').order(:year => :desc)
它产生以下 SQL:
SELECT count(*) as count, extract(year from created_at) as year, extract(month from created_at) as month FROM "posts" GROUP BY year, month ORDER BY "posts"."year" DESC
并出现以下错误:
PG::UndefinedColumn: ERROR: column posts.year does not exist
如果我按计数排序,查询实际上会运行,.order(:count => :desc)
但它似乎实际上并没有按照我预期的方式排序(切换到:asc
没有什么不同)。
我已经搜遍了 SO 和谷歌,但无济于事。我也尝试过排序,created_at
但它会引发ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "posts.created_at" must appear in the GROUP BY clause or be used in an aggregate function
错误。理想情况下,我会运行一个简单的Post.order(:created_at => :desc)
,然后对排序良好的结果运行分组查询,但我不知道如何。
非常迷失......我如何检索带有year
和month
和count
列的帖子,但按时间顺序对结果组进行排序?
非常感谢您的帮助!