2017-06-28 4 views
0

私は学生のデータベースを作成しており、ヘッダーを含むcsvファイルを読み込み、各非ヘッダー行を生徒オブジェクトとして格納する次のコードを用意しています。csvの列をモデル化するには?

class Student < ApplicationRecord 
    def self.import(file) 
      CSV.foreach(file.path, headers: true) do |row| 
       Student.create! row.to_hash 
      end 
    end 
end 

私の問題は、私はインポートする必要のCSVファイルを別の形式のものとすることができるということです。いくつかのヘッダーは次のように整理されているかもしれません。

大学院生|ファーストネーム|姓|学部小学生

ファーストネーム| Last_name |メジャー|マイナー

First_name | Last_name | Class_year

ご覧のとおり、すべてのフィールドが存在するわけではなく、必ずしも同じ順序ではない可能性があります。私はこれにどのように対処できますか?あなたが属性を持つ列をマップするために、このような何かを行うことができ

+0

を、なぜあなたはすべての列が必要なのか、なぜあなたは順序で列が必要なのでしょうか? – Leantraxxx

+0

生徒の属性には「メジャー」という名前が付いているかもしれませんが、列名は「学部長」ですのでフィールド「メジャー」のみを知っているためフィールド「学部メジャー」は認識できません –

+0

あなたは申し訳ありません – Leantraxxx

答えて

0

:列は学生のクラス属性と一致する場合

MAP = { 
    "Undegraduate Major" => :major, 
    "First Name" => :first_name, 
    "Last Name" => :last_name, 
    "Class Year" => :class_year, 
    "Undergraduate Minor" => :minor, 
    "Major" => :major, 
    "Minor" => :minor, 
    "Class_year" => :class_year 
} 

CSV.foreach(file.path, headers: true) do |row| 
    data = {} 

    row.to_hash.each do |k, v| 
    key = MAP[k] 
    data[key] = v 
    end 

    Student.create! data 
end 
+0

こんにちは!ありがとう、私はこのソリューションは動作するはずだと思うが、私は次のエラーに実行している: "Unknown attribute" for Student "それは属性として読み取っているようだが、csvファイルは属性としてはない。 –

+0

私は、あなたが存在しない属性に列をマッピングしていると思います。 – Leantraxxx

+0

ええ、ありがとうございました!存在する属性が存在する場合、これがどのように挙動するか説明できますか?いくつかのcsvファイルがありますが、他のcsvファイルは含まれていません。 nullにする –

関連する問題