如何将这些对象分组为哈希?

时间:2012-05-30 03:27:39

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个事件模式,其datetime字段标题为scheduled_time。我需要创建一个散列,其中包含某种格式的日期名称('mon','tue'等)作为键,以及当天发生的事件计数作为值。我怎么能这样做?

{
    'mon' => 2,
    'tue' => 4,
    'wed' => 3,
    'thu' => 5,
    'fri' => 12,
    'sat' => 11,
    'sun' => 7,
}

我正在使用Rails 3.2.0和Ruby 1.9.2

1 个答案:

答案 0 :(得分:0)

最简单的方法是将count:group选项一起使用:

h = Model.count(:group => %q{to_char(scheduled_time, 'dy')})

像往常一样,GROUP BY的特定功能取决于数据库;上面的to_char方法适用于PostgreSQL,使用MySQL可以使用date_formatlower

h = Model.count(:group => %q{lower(date_format(scheduled_time, '%a'))})

对于SQLite,您可能会使用strftime格式{{3}},然后手动将数字转换为字符串。

请注意,使用%w将为您提供一个带有漏洞的哈希:如果当天表中没有任何条目,那么哈希将没有密钥。如果你真的想要七个键,那么用零创建一个Hash:

Model.count(:group => ...)

然后将h = { 'mon' => 0, 'tue' => 0, ... } 结果合并到其中:

count