在ActiveRecord中查询不同的月份

时间:2011-08-11 13:33:27

标签: ruby-on-rails activerecord

我的rails应用数据库中有一个像“2011-06-30”这样的日期字段。日期可能在几个月的范围内。我想知道如何使用AR查询我的数据库中的不同月份。

我想最终得到的结果是:

[January, February, April, June]

2 个答案:

答案 0 :(得分:4)

不确定是否有纯粹的AR方式。

使用Postgre,你可以这样做:

Model.select("distinct date_part('month',your_date_field) as my_months").all

这将返回类似[1,3,10]的数组。

然后,您可以使用Date::MONTHNAMES[your month]显示数组的值,以获取全名而不是数字。

更新 - 基于Caley的评论,可能更多数据库不可知

Yourmodel.select('distinct date_field').all.collect{|x| x[:date_field].month}.uniq

将给出

[1, 5, 6, 7, 8, 11, 12, 2, 3, 4, 9, 10] 

如果您的数据超过1年,则意味着您将迭代超过365个元素。 (糟糕的366年)。所以也许性能打击是可以接受的。 我试过运行这个

(Date.new(2011,1,1)..Date.new(2011,12,31)).collect{|x| x.month}.uniq

结果立即显现

答案 1 :(得分:2)

谢谢@Pierre,但我就是这样做的:

MyModel.all.map { |d| d.my_date_field.strftime('%b %y') }.uniq
# ["Jun 11", "Jul 11", "Aug 11"]