2つのレコードタイプを持つ構造化されたコンマ区切りファイルがあります。さまざまなレコードは、ヘッダーエントリ(HまたはP)によって区別されます。ファイル形式は次のとおりです。
"H","USA","MD","20904"
"P","1","A","Female","W"
"P","2","A","Male","H"
ファイルをインポートしてから、インポートしたデータを使用してアクティブレコードモデルを作成したいと思います。私が使用しているアプローチは、フィールドの数、オブジェクト名、および列を含むフィールドマップを作成することです。
次に、フィールドマップを利用します
$ field_map =
{
'H' =>
{
:count => 4,
:object => :Header,
:cols => [:record_type, :country_id, :state, :zip]
},
'R' =>
{
:count => 4,
:object => :RaceData,
:cols => [:record_type, :household_size, :gender, :race]
}
}
次に、FastCSVを使用してファイルをインポートし、caseステートメントを使用して、ファイルがどのように変換され、activerecordcreateステートメントで使用されるかを示します。
FasterCSV.foreach(filename) do |row|
tbl_type = row[0]
tbl_info = $field_map[tbl_type]
unless (tbl_info.nil?)
field_no = tbl_info[:count]
object = tbl_info[:object]
columns = tbl_info[:cols]
record_type = new_record[:record_type]
case record_type
when "H"
factory_build_h_record(new_record)
when "P"
factory_build_p_record(new_record)
end
end
end
上記のコードは、スペースの制約のために要約されています。私のアプローチは問題なく機能しますが、私はルビーに不慣れであり、常にベストプラクティスと「真の」Rubyのやり方に興味を持っています。より経験豊富なプログラマーがこの問題にどのように取り組むかを聞きたいと思います。ご入力いただきありがとうございます。