ruby-on-rails - 数组操作(按特定组对一列求和,保持其他组相同)

标签 ruby-on-rails ruby grouping

我有一个日志表,其中包含名称、持续时间、类型、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 数组操作/常用惯用语的良好资源,那就太好了!

最佳答案

首先是一些注释。

您的表未正确标准化。您应该将此表拆分为(至少)两个:usersdurations。您应该这样做有很多原因,那就是关系数据库 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/

相关文章:

ruby-on-rails - 为不使用 Mechanize/Ruby 表单的站点输入登录信息

ruby 菜鸟?创建 ruby 日期

ruby-on-rails - rails : What is the convention for controllers with many words

javascript - Heroku bootstrap 导航栏不渲染

ruby-on-rails - Rails 4 中的 AJAX、HTML5 历史 API 和缓存

c# - 过滤不包含所有类型元素的组的有效方法

python - 使用 Python 对字典中的列表中的值进行分组以使用每个值的组号创建新字典?

ruby-on-rails - 将 Redcarpet 与 rails 4 一起使用

ruby-on-rails - Rails 中的胖模型 : How do I return hash (errors) or object (when success)

c# - 如何在 GroupItem 中显示自定义文本?