涉及日期的组Rails查询

时间:2015-02-23 21:30:16

标签: ruby-on-rails ruby ruby-on-rails-4

我在rails中做了一个简单的查询......

@person.visits

给出了记录列表......

[#<Person::Visit id: 244, date: "2015-02-25", place: "" >,
#< Person::Visit id: 248, date: "2015-02-28", place: "" >,
#< Person::Visit id: 249, date: "2015-03-26", place: "" >,
#< Person::Visit id: 250, date: "2015-03-29", place: "" >,
#< Person::Visit id: 251, date: "2015-04-17", place: "" >,
#< Person::Visit id: 254, date: "2015-04-21", place: "" >]

我想将结果组织成这样的

{"February 2015"=>[25,28], "March 2015"=>[26, 29], "May 2015"=>[17,21]}

我试图使用以下内容,这让我更接近,只是不知道如何以及何时收集日期,例如[25,28]然后按月分组。

@person.visits.group_by { |d| d.date.strftime("%B %Y") }

日期是&#34;日期&#34;数据库中的字段

2 个答案:

答案 0 :(得分:0)

到目前为止,你是正确的,你所拥有的将返回一个月份和年份的哈希值作为关键字,并将数据中的RECORDS返回到与该组相对应的数组中。如果您只想要那些记录中的数字天数,则必须遍历它:

visits = @person.visits.group_by { |d| d.date.strftime("%B %Y") }

visits.each {|key,value| value.collect! {|rec| rec.due_date.strftime("%d")} }

这只是遍历散列的每个成员,获取记录数组并将它们转换为记录的日期部分。

如果您希望用零填充日期,即“01,02 ...”,请使用"%d"如果您不想使用零"%e"

答案 1 :(得分:0)

这实际上是一种痛苦。我不会使用group_by,而是手动构建哈希:

@person.visits.inject({}) do |hash, visit|
  key = visit.date.strftime("%B %Y")
  value = visit.date.day
  if hash[key]
    hash[key] << value
  else
    hash[key] = [value]
  end
  hash
end

这将创建所需的哈希值。