2021年9月9日 現場Rails Chapter7-6-2 CSVデータを入力(インポート)する
CSVデータをインポートする際に使われるメソッド
Csv.foreach
1行ずつ処理をするため、行数が多いCSVファイルを扱う場合でもメモリ使用量を気にしないで使えます。
slice
引数で指定されたキーとその値だけを含む Hash を返します。
to_hash
to_hashメソッドを呼ぶことで、次のようなハッシュの形に変換されます。
{"name"=>"たすくのなまえ", "description"=>"", "created_at"=>2021-09-07 02:30:00 UTC", "updated_at"=>"2021-09-09 09:30:00 UTC"
CSVデータを入力(インポート)する
# app/models/task.rb def self.import(file) # headers: trueで1行目をヘッダーとして扱うことができる。 # headers: trueとすることで、DBに登録する際に1行目をレコードとして登録せずに、2行目以降からレコードしてDBに登録するようにしている。 CSV.foreach(file.path, headers: true) do |row| task = new task.attributes = row.to_hash.slice(*csv_attributes) task.save! end end
attributes = は、変数ではなく特定のattributeを変更するメソッドです。 オブジェクトの属性を変更しただけで、DBには保存されていないため、saveします。
def import current_user.tasks.import(params[:file]) redirect_to tasks_url, notice: "タスクを追加しました" end
可変長引数
引数に* をつけると、個数に制限なく、引数を渡せる可変長引数というものになります。可変長引数を使うことで、引数を配列として受け取ることが出来ます。
a = [1, 2] b = [1, 2, 3] p a.push(b) #=> [1, 2, [1, 2, 3]] p a.push(*b) #=> [1, 2, [1, 2, 3], 1, 2, 3]
参照
【Ruby】よく使う、CSVライブラリを使ったCSV操作
https://qiita.com/mogulla3/items/2d2053f0e4c13ba3b6dc
Ruby 3.0.0 リファレンスマニュアル ライブラリ一覧 csvライブラリ CSV::Rowクラス
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aRow.html#I_ROW
instance method Hash#slice
https://docs.ruby-lang.org/ja/latest/method/Hash/i/slice.html
Active Recordのattributesの更新メソッド
https://morizyun.github.io/ruby/active-record-attributes-save-update.html
Ruby 3.0.0 リファレンスマニュアル ライブラリ一覧 組み込みライブラリ Hashクラス
https://docs.ruby-lang.org/ja/latest/method/Hash/i/slice.html