(3.years.ago.to_date..Date.today).map { |date| [date.month, date.year] }.uniq!
返回:
[[11, 2008], [12, 2008], [1, 2009], [2, 2009], [3, 2009], [4, 2009], [5, 2009], [6, 2009], [7, 2009], [8, 2009], [9, 2009], [10, 2009], [11, 2009], [12, 2009], [1, 2010], [2, 2010], [3, 2010], [4, 2010], [5, 2010], [6, 2010], [7, 2010], [8, 2010], [9, 2010], [10, 2010], [11, 2010], [12, 2010], [1, 2011], [2, 2011], [3, 2011], [4, 2011], [5, 2011], [6, 2011], [7, 2011], [8, 2011], [9, 2011], [10, 2011], [11, 2011]]
如何将此变为具有此结构的哈希:
[
[month => 11, year => 2008],
[month => 12, year => 2008],
[month => 1, year => 2009],
etc
]
所以我可以像:
一样使用它foo.first.month # returns 11
foo.first.year # returns 2008
等
答案 0 :(得分:2)
(3.years.ago.to_date..Date.today).map {|date| {:month => date.month, :year => date.year}}
=> [{:month=>11, :year=>2008}, {:month=>11, :year=>2008}, {:month=>11, :year=>2008}...]
然而,问题在于你不会免费获得这些方法。您必须在Hash上覆盖method_missing
,以便为方法提供密钥。
class Hash
def method_missing(method_name, *args)
if key?(method_name)
self[method_name]
else
super
end
end
end
答案 1 :(得分:0)
require 'openstruct'
array = (3.years.ago.to_date..Date.today).map { |date| [date.month, date.year] }.uniq
array.map {|ary| OpenStruct.new([:month, :year].zip(ary))}
答案 2 :(得分:0)
这个问题需要工作,因为你的预期结果没有意义:
你没有哈希,你有一个数组数组......带有键值对(你可以通过索引访问数组,而不是通过键访问数组)。但是键是对不存在的月份和年份对象的引用(我假设你想让它们成为字符串或符号)。然后你也想像对象一样访问它们而不是哈希(即array.first.month
vs array.first[:month]
)。
但无论如何,由于日期对象已经出现月份和年份方法,因此您无需对这些做任何特殊操作。您只需要将一个块传递给uniq
,告诉它您正在使用的标准:
(3.years.ago.to_date..Date.today).to_a.uniq { |date| [date.month, date.year] }