我正在执行查询并从数据库中的数组(MySql2 类型对象)中获取以下数据:
+-----------+---------------+---------------+------+------+---------------+
| build | platform_type | category_name | pass | fail | indeterminate |
+-----------+---------------+---------------+------+------+---------------+
| 10.0.1.50 | 8k | UMTS | 10 | 2 | 5 |
| 10.0.1.50 | 8k | UMTS | 10 | 2 | 5 |
| 10.0.1.50 | 8k | IP | 10 | 2 | 5 |
| 10.0.1.50 | 8k | IP | 14 | 1 | 3 |
| 10.0.1.50 | 9k | IP | 14 | 1 | 3 |
| 10.0.1.50 | 9k | IP | 12 | 1 | 1 |
| 10.0.1.50 | 9k | UMTS | 12 | 1 | 1 |
| 10.0.1.50 | 9k | UMTS | 12 | 1 | 1 |
| 10.0.1.50 | 9k | UMTS | 12 | 1 | 1 |
| 10.0.1.50 | 9k | Stability | 9 | 4 | 0 |
| 10.0.1.50 | 9k | Stability | 15 | 1 | 0 |
我想将其显示在我的 UI 上的表格中,如下所示:
+-----------+---------------+---------------+------+------+---------------+
| build | platform_type | category_name | pass | fail | indeterminate |
+-----------+---------------+---------------+------+------+---------------+
| | | UMTS | 20 | 4 | 10 |
| | 8k |---------------------------------------------|
| | | IP | 24 | 3 | 8 |
| |---------------|---------------------------------------------|
| 10.0.1.50 | | IP | 26 | 2 | 4 |
| | |---------------------------------------------|
| | 9k | UMTS | 36 | 3 | 3 |
| | |---------------------------------------------|
| | | Stability | 24 | 5 | 0 |
---------------------------------------------------------------------------
我确实尝试使用哈希来查找构建的独特平台类型。但由于我对 ruby 很陌生,因此我在正确使用哈希时遇到了困难。如果有人可以帮助我解析数据,我将不胜感激。
最佳答案
假设您有一个数组数组:
@data = sql_results.group_by(&:first).map do |b, bl|
[b, bl.group_by(&:second).map{|p, pl| [p, pl.map{|r| r[2..-1]}] }.sort_by(&:first)]
end.sort_by(&:first)
以下是如何分解逻辑。
- 按第一列对行进行分组。这将返回一个哈希值,其中键作为第一列名称,值作为行数组。
- 按第二列(平台类型)对每个构建列表进行分组。每个组应包含从 3 到最后一个列的列值数组。
- 按平台类型对平台列表进行排序
- 按构建名称对构建列表进行排序
最终的结构如下:
[
[
"10.0.1.50", [
[
"8k", [
["UMTS", 20, 4, 10],
["IP", 24, 3, 8]
]
],
[
"9k", [
["IP", 26, 2, 4],
["UMTS", 36, 3, 3],
["UMTS", 24, 5, 0]
]
]
]
]
]
您可以在 View 布局示例中使用它:
%table
%tr
- %w(build platform_type category_name pass fail indeterminate).each do |name|
%th=name
- @data.each do |build, build_list|
%tr
%td=build
%td{:colspan=4}
%table
- build_list.each do |build, platform_list|
%tr
%td=build
%td{:colspan=3}
%table
- platform_list.each do |row|
%tr
- row.each do |attr|
%td=attr
如果您使用 AR 模型,您需要执行以下操作:
class Build < ActiveRecord::Base
def self.builds_by_platform
reply = Hash.new{|h, k| h[k] = Hash.new{|h, k| h[k] = []}}
Build.order("build ASC, platform_type ASC").find_each do |row|
reply[row.build][row.platform_type] << row
end
reply.map{|b, bh| [b, bh.sort_by(&:first)}.sort_by(&:first)
end
end
在 Controller 中,您可以访问标准化变量:
@report _list = Build.builds_by_platform
您可以使用@report _list
变量来呈现表格。
关于ruby-on-rails - Ruby 解析数组(特殊情况),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203057/