1

何千ものレコードを持つデータベースがあります

Code  | Name  | Price
00106 | Water | 9.99
00107 | Onion | 8.99

GES以下のようなファイルにコード化されています。

  • 00F列ヘッダーを意味します
  • 00I行を挿入することを意味します

他にも(00D行の削除または00U更新用)のようなものがあります

00F
0101
02Code
031
00F
0102
02Name
031
00F
0103
02Price
030
00I
0100106
02Water
030999
00I
0100107
02Onion
030899

このファイルを処理してデータベースにプッシュするインポーターを作成したいと考えています。だから私はそれを実装し始めました:

class Importer
  CONN = ActiveRecord::Base.connection
  F = "00F"
  I = "00I"

  def extract_to_database(collection)
    add       = true
    tmp       = []
    type      = F
    inserts   = []

    collection.each_with_index do |line, i|
      _type    = line.strip
      _changed = [F,I].include? _type

      if _changed && i > 0
        case type
        when F then @f << tmp
        when I
          group_id = Group.find_by(code: tmp[1]).id
          inserts.push "(group_id,'#{tmp[2]}','#{tmp[3]}')"
        end

        tmp  = []
        type = _type
      end

      tmp << line
    end
    sql = "INSERT INTO products (`group_id`, `name`, `price`) VALUES #{inserts.join(", ")}"
    CONN.execute sql
  end
end

これには 1 つの問題があります。関数型プログラミングを使用してリファクタリングしたいと思います。

また、他のモデルを見つけcodeproductsテーブルに関連するsome_model_id列に配置する必要があるため、プロセス全体が複雑になる可能性があります。現在、このデータをインポートするには数時間かかるからです。

おそらく、Ruby を使用することは最善の選択肢ではありません。

4

1 に答える 1