Как хранить значения массива внутри таблицы в ruby ​​на рельсах? - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть две таблицы с именами «import» и «import_details».Внутри таблицы «import» находятся файлы журналов, которые были загружены с использованием carrierwave.У меня есть метод, который читает файл журнала и извлекает данные, которые мне нужны из каждой записи (я использовал для этого регулярное выражение).Мое выражение регулярного выражения содержит в общей сложности 12 групп захвата, и каждая группа захвата - это значение, которое я хочу сохранить в таблице import_details.

Моя проблема в том, что я не знаю, как перебирать каждую изих и сохранить их в каждом ряду после того, как выражение регулярного выражения достигло 12-й группы захвата.

Мой create_imports.rb:

class CreateImports < ActiveRecord::Migration[5.2]
  def change
    create_table :imports do |t|
      t.string :name
      t.string :attachment

      t.timestamps
    end
  end
end

create_import_details.rb:

class CreateImportDetails < ActiveRecord::Migration[5.2]
  def change
    create_table :import_details do |t|
      t.string :controller
      t.string :controllermethod
      t.string :ipaddress
      t.datetime :datetime
      t.string :methodname
      t.string :sessionid
      t.string :cycletime
      t.string :restimeview
      t.string :restimerecord
      t.integer :statuscode
      t.string :statusname
      t.string :urladdress

      t.timestamps
    end
  end
end

Мой метод чтения файла журнала:

def processimport
    path = Dir.glob('/sample/file/path/'@import = Import.find(params[:id])'/*.log').first
    regex = /sampleregexexpression/

    samplefile = File.open(path)
    string = File.read(samplefile)

    string.scan(regex).each do|x|
      puts x
    end 
  end

В настоящее время мой метод processimport только распечатывает значения каждой группы захвата, которые получает мое регулярное выражение.Любая идея, как пройти через них и сохранить в базе данных?

Пример ответа

string.scan(regex).each do|x|
  puts x
end

выглядит так:

SampleController
create
10.910.992.227
2020-12-01 12:00:00
POST
12mnd9adkmc82js9akjnas98sdv3
0.12995 (7 reqs/sec)
0.00027 (0%)
0.09836 (75%)
201
Created
[https://www.soap.com/api/sample.xml]
AnotherController
index
888.12.445.247
2020-12-01 12:00:00
GET
ertye73do928hxksmsu2edjejend783k
0.00905 (110 reqs/sec)
0.00007 (0%)
0.00281 (31%)
200
OK
[https://www.samplecloud.com/api/anothersample.xml?sample_id=9002&after=2020-12-01 12:00:00Z&page=1]
ExampleController
index
838.33.55.776
2020-12-01 12:00:00
GET
7282849jfjdkdo2a29snxmmjscnssdn8
0.23466 (4 reqs/sec)
0.15961 (68%)
0.06614 (28%)
200
OK
[https://customer.example.com/en/example]
ThisIsAController
show
992.334.556.1
2020-12-01 12:00:00
GET
jasd7839njsdnlkal3898259adansdn
0.26166 (3 reqs/sec)
0.13863 (52%)
0.11492 (43%)
200
OK
[https://www.sample.com/en/soap/shampoo]

В этом примереЕсть 4 записи файла журнала в одном файле журнала, каждая из которых начинается с контроллера (группа захвата 1) и заканчивается URL-адресом (группа захвата 12).Цель состоит в том, чтобы сохранить в таблице базы данных первый набор групп захвата в одной строке, второй набор в следующей строке и т. Д.

1 Ответ

0 голосов
/ 04 февраля 2019

Я бы создал хеш значений, которые вы хотите в цикле:

    my_hash = {}
    string.scan(regex).each do|x|
      my_hash[:key] = x
    end 

, пока каждый ключ точно соответствует столбцу в вашей таблице, который вы можете вызвать

ImportDetails.create(my_hash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...