6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

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