2013-04-24 1 views
2

Я уверен, выполнение запроса и получение следующих данных из базы данных в (объект типа mysql2) массив:рубин разборе Array (Special Case)

+-----------+---------------+---------------+------+------+---------------+ 
| 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 | 

Я хочу, чтобы отобразить его на моем пользовательском интерфейсе в таблице , что-то вроде этого:

+-----------+---------------+---------------+------+------+---------------+ 
| 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 | 
--------------------------------------------------------------------------- 

Я попытался использовать хеш, чтобы найти уникальные типы плат для сборки. Но поскольку я очень новичок в рубине, у меня возникают проблемы с использованием хэша должным образом. Буду признателен, если кто-то поможет мне разобрать данные.

+0

Вы хотите, чтобы активные запросы к записи получали отдельную сборку? – shishirmk

ответ

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-й колонке (тип платформы). Каждая группа должна содержать массив значений col от 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

Так как я новичок в рубин, я использую это, чтобы получить данные из MySQL: @main = $ connection.execute («выберите сборки, platform_type, category_name, пройти, не получится, неопределенными из сборки;») Может вы, пожалуйста, объясните мне первые 3 строки о том, как получить данные из базы данных, используя ваш синтаксис. –

+0

Вы используете Ruby on Rails? –

+0

Да, я использую Ruby on Rails –