Разбор HTML в Rails без новой записи каждый раз? - PullRequest
0 голосов
/ 09 января 2012

У меня есть следующий код, который разбирает таблицу HTML настолько просто, насколько это возможно.

# Timestamp (Column 1 of the table)
page = agent.page.search("tbody td:nth-child(1)").each do |item|
  Call.create!(:time => item.text.strip)
end

# Source (Column 2 of the table)
page = agent.page.search("tbody td:nth-child(2)").each do |item|
  Call.create!(:source => item.text.strip)
end

# Destination (Column 3 of the table)
page = agent.page.search("tbody td:nth-child(3)").each do |item|
  Call.create!(:destination => item.text.strip)
end

# Duration (Column 4 of the table)
page = agent.page.search("tbody td:nth-child(4)").each do |item|
  Call.create!(:duration => item.text.strip)
end

Хотя приведенный выше код работает хорошо, он рассматривает каждый «элемент» как новую запись. Таким образом, он добавляет запись для каждой строки времени, другую запись для каждого столбца источника и т. Д.

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

Для дополнительной информации вот файл миграции, который показывает мою структуру базы данных:

class CreateCalls < ActiveRecord::Migration
  def change
    create_table :calls do |t|
      t.datetime :time
      t.string :source
      t.string :destination
      t.string :duration

      t.timestamps
    end
  end
end

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 11 января 2012

Рассмотрим итерацию по каждой строке вместо каждого столбца.

page = agent.page.search("table tbody tr").each do |row|
  time        = row.at("td:nth-child(1)").text.strip
  source      = row.at("td:nth-child(2)").text.strip
  destination = row.at("td:nth-child(3)").text.strip
  duration    = row.at("td:nth-child(4)").text.strip
  Call.create!(:time => time, :source => source, :destination => destination, :duration => duration)
end
1 голос
/ 09 января 2012

Вместо того, чтобы вызывать call.create каждый раз, просто добавьте весь источник в строку и в конце сохраните запись.

...