2013-04-24 56 views
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 | 
--------------------------------------------------------------------------- 

我曾嘗試使用哈希來找到構建的唯一平臺類型。但是因爲我對ruby非常陌生,所以我無法正確使用散列。如果有人能幫我解析數據,我將不勝感激。

+0

你想活動記錄查詢獲得獨特的構建? – shishirmk 2013-04-24 22:54:27

回答

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到最後一個列的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變量用於呈現表。

+0

由於我是ruby的新手,我正在使用它從MySQL獲取數據: 可以使用: @main = $ connection.execute(「select builds,platform_type,你可以向我解釋前三行關於如何使用你的語法從數據庫獲取數據。 – 2013-04-24 22:59:19

+0

你在使用Ruby on Rails嗎? – 2013-04-24 23:03:11

+0

是的,我正在使用Ruby on Rails – 2013-04-24 23:09:18