インポート処理

管理者がjson形成のテキストファイルをシステムに食わせてデータ登録する機能の一般的な処理。 ActiveRecordを拡張する。

  • データ形式はHash
  • 名称とデータのペアで記述する
  • ブロックを取って、保存処理はブロックで行う。
  • インポートに失敗したデータだけを返す。

システム画像インポート

self.import_system_picture attr

パラメータ

  • attr:カラム値

解説

  • カラム値の"text"キーの値をBase64テキストとして取得する。
  • システム画像モデルに保存を依頼して作成されたシステム画像をもらう。
    • テキストデータをBase64展開して画像化する。
    • 画像データで画像ライブラリをロードする。
    • 画像ライブラリを渡す。
  • システム画像オブジェクトのidを返す。
  • 例外ケース
    • カラム値に画像データがなかったならFalseを返す。
    • 画像ライブラリのロードが失敗ならFalseを返す。
    • システム画像の保存が失敗(False)ならFalseを返す。

システム画像置換

self.replace_system_picture attr

パラメータ

  • attr:カラム値

解説

インポート用便利ツール。システム画像は環境ごとにidが違う。だから、システム画像のインポートをid指定でやるのは難しい。画像データをテキストで受け取り、idに置き換える処理があると便利。

仕様としては、XXXX_idという項目がHash構造だった場合にテキスト化された画像データをシステム画像扱いでインポートして、idに置き換える仕組み。Hashが階層構造であっても再帰的に探索する。ただし、途中で一つでも画像インポートに失敗した場合は、処理を中断してFalseを返す。

  • カラム値をキー名とキー値のペアで繰り返し処理する。
    • キー名が_idで終わり、キー値がHashの場合、
      • システム画像インポートを依頼して、idを取得する。
        • キー値を渡す。
      • idを対象データのキー値とする。
    • キー値がHashの場合、
      • システム画像置換を依頼して、置換済カラム値を取得する。(再帰処理)
        • キー値を渡す。
      • 置換済カラム値を対象データのキー値とする。
  • カラム値を置換済カラム値として返す。
  • 例外ケース
    • システム画像のインポートが失敗(False)ならFalseを返す。
    • システム画像置換が失敗(False)ならFalseを返す。

データ更新準備

self.modify_object name, attr, key='name'

パラメータ

  • name:キー値。
  • attr:更新するすべてのカラム値
  • key:キーカラム。モデルのユニーク性を保証するカラムの名前

解説

インポート用便利ツール。インポートするようなマスターデータは、あれば取得して更新、なければ新規作成するのがスタンダード。

  • キーカラムがキー値で一致する行を取得する。
  • 取得できなければ新規オブジェクトを生成する。
    • キーカラムの値はキー値で更新する。
  • カラム値をパラメータのattrで更新する。
  • 生成したオブジェクトを返す。

リストからのインポート

import_list list, &blk

パラメータ

  • list:インポートデータ
    • Hash型:検索キーをキー値、カラム値を値とする
  • blk:インポート処理

戻り

  • インポート失敗データ(オブジェクト)のすべて
    • 配列
    • 成功したときは空の配列を返す

解説

インポートデータを一気にインポートする。一件でも失敗するなら、更新しない。失敗した理由はそれぞれなので、失敗したオブジェクトだけを返す。エラーレポートは呼び出し側が行うこと。複数の失敗を含むケースもあるので、戻り値は配列とする。

  • ロールバックできるように、トランザクションを用意する。
  • 戻り値を配列として初期化する。
  • インポートデータの各々を、キー値とカラム値として繰り返し処理する。
    • インポート処理を実行して、操作オブジェクトを取得する。
      • キー値とカラム値を渡す。
    • 操作オブジェクトに検証結果を問い合わせ、失敗していたら、戻り値に追加しておく。
  • 戻り値を返す。
  • 注意ケース
    • インポート処理に失敗(データ不正)したときは、エラー内容ではなく、そのオブジェクトを返す。
    • 繰り返し処理からは抜けないで、最後までやり通す。
    • すべての繰り返し処理が終わって、一つでもインポート処理に失敗していたらロールバックする。

テキストインポート

self.import_text data, &blk

パラメータ

  • data:Jsonテキスト
  • blk:インポート処理

戻り

  • インポート失敗データ(オブジェクト)のすべてを配列で返す
    • 成功したときは空の配列を返す

解説

テキストで記述されたデータをインポートする。一件でも失敗するなら、更新しない。

  • Jsonにパースを依頼して、jsonデータを取得する。
    • Jsonテキストを渡す。
  • 自身にリストからのインポートを依頼して、インポート結果を取得する。
    • jsonデータとインポート処理を渡す。
  • インポート結果を返す。
  • 例外ケース
    • Jsonのパースが失敗したとき、処理を中断する。

ファイルからのインポート

self.import_file filename, &blk

パラメータ

  • filename:ファイル名
  • blk:インポート処理

戻り

  • インポート失敗データ(オブジェクト)のすべてを配列で返す。
    • 成功したときは空の配列を返す

解説

主にコマンドからファイルでインポートする用途。ファイルはjson形式。

  • ファイルの読み込みでファイル名を開いて、テキストデータを取得する。
  • 自身のテキストインポートを依頼して、インポート結果を取得する。
    • テキストデータとインポート処理を渡す。
  • インポート結果を返す。
  • 例外ケース
    • ファイルの読み取りに失敗したとき、処理を中断する。
    • ファイルの内容がJsonとしてパースできないとき、処理を中断する。

Urlからのインポート

import_url url, &blk

パラメータ

  • url:文献内のUrl
  • blk:インポート処理

戻り

  • インポート失敗データ(オブジェクト)のすべて
    • 配列
    • 成功したときは空の配列を返す

解説

ファイルからの取り込みと同等機能。開く相手がUrlってだけ。もしかしたらOpenUriで統一できるかも?

  • ファイルの読み込みで文献内のUrlを開いて、テキストデータを取得する。
  • 自身にテキストインポートを依頼して、インポート結果を取得する。
    • テキストデータとインポート処理を渡す。
  • インポートの結果を返す。
  • 例外ケース
    • Urlの読み込みに失敗したとき、処理を中断する。
    • ファイルの内容がJsonとしてパースできないとき、処理を中断する。

文献からのインポート

import_urls urls, &blk

パラメータ

  • urls:文献
    • url(文字列)の配列
  • blk:インポート処理

戻り

  • 各urlのインポート結果
    • Hash:キー値はurl、値はHash
      • キー値がexceptionのとき、値はHashで、例外発生場所(location)と例外発生理由(message)
      • キー値がvalidationsのとき、値は配列で、インポート失敗データ(オブジェクト)のすべて

解説

文献に記載されたurlをインポートする。結果はurlごとに分別されて返る。各結果は、検証結果と例外に分けている。

  • 戻り値をHashで初期化する。
  • 文献の各々をurlとして繰り返し処理する。
    • 例外付きインポート結果としてHashを作成する。
    • 自身にUrlからのインポートを依頼して、インポート結果を取得する。
      • Urlインポート処理を渡す
    • 例外付きインポート結果にvalidationsをキーとして、インポート結果を追加する。
    • 戻り値に、Urlをキーとして例外付きインポート結果を追加する。
  • 戻り値を返す。
  • 注意ケース
    • Urlからのインポートで何らかの例外が発生したとき、例外付きインポート結果にexceptionをキーとして、例外発生場所と例外発生理由をHashで追加する。処理は続行する。