2011-08-11 43 views
0

我在我的rails應用程序的數據庫中有一個類似「2011-06-30」的日期字段。日期可能在幾個月的範圍內。我想知道如何使用AR來查詢我的數據庫中不同的月份。在ActiveRecord中查詢不同的月份

我想結束了,結果是一樣的東西:

[January, February, April, June] 
+0

什麼數據庫? SQLite的? MySQL的? postge? – fl00r

+1

開發是sqlite,但生產將postgres。我希望有一個非數據庫特定的解決方案。 – Brand

+0

當你說你有像「2011-06-30」這樣的日期時,那些在數據庫中存儲爲* strings *的數據,還是作爲某種日期/時間字段存儲? – Zabba

回答

1

謝謝@Pierre但是這是我做到了

MyModel.all.map { |d| d.my_date_field.strftime('%b %y') }.uniq 

這讓我有點像

["Jun 11", "Jul 11", "Aug 11"] 
3

不知道有一個純AR辦法做到這一點。

與Postgre,你可以做這樣的:

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

這將返回數組一樣[1,3,10]

然後,您可以使用Date::MONTHNAMES[your month]來顯示數組的值,使其具有全名而不是數字。

更新 - 基於凱萊的評論,可能更DB無關

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

'''Model.find_by_sql()'''也是一個選項,以及查找所有月份並調用'''.uniq''',儘管這不會像表演一樣。 –