我有一个日志表,其中包含名称、持续时间、类型、ref_id
列。
我经常更新表格,所以它可能看起来像一个 ['bill', 'bob', 'bob', 'jill']
的列(名称),以及 [3, 5, 6, 2]
表示持续时间,['man', boy', 'boy', 'girl']
表示类型,[1, 2, 2, 3]
用于 ref_id。
我想操作我的表,以便我可以添加所有持续时间,以便获得哈希值或如下所示的内容:
{'name' => ['bill', 'bob', 'jill'], 'duration' => [3, 11, 2], 'type' => ['man', 'boy', 'girl'], ref_id => [1, 2, 3]}
我该怎么做?
(有关更多信息 - 目前我正在执行 Log.sum(:duration, :group => 'name')
,它为我提供了名称本身作为键(bill、bob、 jill) 而不是列名,并使用正确的持续时间总和作为它们的值 (3, 11, 2)。但随后我丢失了其余的数据...)
我想我可以手动检查每个日志并添加名称/类型/ref_id(如果它不在哈希中),然后添加到持续时间。如果是这样,最好的方法是什么?
如果您了解有关 Rails 数组操作/常用惯用语的良好资源,那就太好了!
最佳答案
首先是一些注释。
您的表未正确标准化。您应该将此表拆分为(至少)两个:users
和 durations
。您应该这样做有很多原因,那就是关系数据库 101。
此外,您想要的结果看起来也不正确,这表明您正在对数据进行预分组以适合您的演示文稿。将这些结果放入哈希数组中通常比放入数组哈希中更符合逻辑。
现在来回答:
使用您的表格,您可以简单地执行 GROUP BY:
SELECT name, type, ref_id, SUM(duration) as duration
FROM logs
GROUP BY name, type, ref_id
或者,使用 AR:
durations = Log.find(:all,
:select => 'name, type, ref_id, SUM(duration) as duration',
:group => 'name, type, ref_id'
)
为了将其转换为数组的哈希值,您可以使用以下内容:
Hash[
%w{name, type, ref_id, duration}.map{|f|
[f, durations.map{|h|
h.attributes[f]
}]
}
]
关于ruby-on-rails - 数组操作(按特定组对一列求和,保持其他组相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4863774/