【问题标题】:Ruby parsing Array (Special Case)Ruby解析数组(特例)
【发布时间】:2013-04-18 15:46:39
【问题描述】:

我正在执行一个查询并从数据库中以数组的形式(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​​ 很陌生,所以我无法正确使用哈希。如果有人可以帮助我解析数据,我将不胜感激。

【问题讨论】:

  • 您希望活动记录查询获得不同的构建?

标签: ruby-on-rails ruby ruby-on-rails-3 parsing mysql2


【解决方案1】:

假设你有一个数组数组:

@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)

这里是如何分解逻辑。

  • 按第一列对行进行分组。这将返回一个散列,其中键作为第一列名称,值作为行数组。
  • 按第 2 列(平台类型)对每个构建列表进行分组。每个组应包含从 3 到最后一个 col 的 col 值数组。
  • 按平台类型对平台列表进行排序
  • 按构建名称对构建列表进行排序

最终的结构是这样的:

[
  [
    "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]
        ]
      ]
    ]
  ]
]

您可以在视图布局示例中使用它:

%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

在您的控制器中,您可以通过以下方式访问标准化变量:

@report _list = Build.builds_by_platform

您可以使用@report _list 变量来呈现表格。

【讨论】:

  • 由于我是 ruby​​ 新手,我使用它从 MySQL 获取数据:@main = $connection.execute("select builds,platform_type, category_name, pass, fail, indeterminate from builds; ") 你能解释一下前 3 行如何使用你的语法从数据库中获取数据吗?
  • 你在使用 Ruby on Rails 吗?
  • 是的,我正在使用 Ruby on Rails
  • 我只想知道 sql_results 是从哪里来的?我需要在某处指定表名和列?
  • sql_results 是保存从数据库中获取的数据的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 2022-11-29
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多