我正在尝试在rails 3中重新创建以下mysql查询
select count(id), year(created_at), month(created_at) from table where published_state = 'published' group by year(created_at), month(created_at);
我尝试过类似的事情:
results = Table.select('count(id), year(created_at), month(created_at)').where('published_state LIKE ?', 'published').group('year(created_at), month(created_at)')
但它没有返回我想要的东西。
我只是得到了回报
[#<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >,
#<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >]
我该如何做到这一点?
谢谢!
答案 0 :(得分:15)
试试这个:
Table.where(:published_state => 'published').
group('year(created_at)').group('month(created_at)').count(:id)
结果的格式并不是我所期望的(它是一个带有[year, month]
和计数值等数组键的哈希值,但它可能会满足您的需求吗?
答案 1 :(得分:0)
如果您正在使用PostgreSQL,您还可以使用date_trunc函数(为了便于阅读而分割行,但可能无法在真正的Ruby中使用):
Table.select('count(id), date_trunc('month', created_at) as month')
.where('published_state LIKE ?', 'published').group('month')
基本上,它会截断或切断不再重要的日期部分。例如,如果您选择“月”,它仍会保留带月份的年份,但不会保留日期和时间。
我可能也会这样订购:
Table.select('count(id), date_trunc('month', created_at) as month')
.where('published_state LIKE ?', 'published').group('month')
.order('month' DESC)
.limit(24)
在文档here中阅读更多内容。