2

クエリを実行し、データベースから次のデータを配列 (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 |
 ---------------------------------------------------------------------------

ハッシュを使用して、ビルドの固有のプラットフォーム タイプを見つけようとしました。しかし、私はルビーに非常に慣れていないため、ハッシュを適切に使用するのに問題があります。誰かがデータの解析を手伝ってくれれば幸いです。

4

1 に答える 1

2

配列の配列があると仮定します:

@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 から最後の列までの列値の配列が含まれている必要があります。
  • プラットフォーム リストをプラットフォーム タイプ別に並べ替える
  • ビルド名でビルド リストを並べ替える

結果の構造は次のようになります。

[
  [
    "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テーブルのレンダリングに変数を使用できます。

于 2013-04-24T22:55:13.220 に答える