【Ruby on Rails】CSVインポート
[Rails上で、CSVファイルを読み込んでみた]
(https://qiita.com/m-shin1/items/7e8cdea2644e47b87fbf)
[【Rails】CSVファイルからデータをインポート]
(https://qiita.com/d0ne1s/items/d49423796dd1c801afd3)
これを参考にトライ
結果その通りにやったらできました。
(投稿者様、ありがとうございます)
だが、rubyの文法でつまづく。
だれかわかる方いらっしゃたら助けていただけるとありがたいです。
def index
@users = User.all
end
def import
# fileはtmpに自動で一時保存される
User.import(params[:file])
redirect_to users_url
end
このimportコントローラーUser.importのimportメソッドは、user Modelを操作するために、下記で、クラスメソッドとして定義されている、importメソッドであることはわかった。
class User < ApplicationRecord
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
# IDが見つかれば、レコードを呼び出し、見つかれなければ、新しく作成
user = find_by(id: row["id"]) || new
# CSVからデータを取得し、設定する
user.attributes = row.to_hash.slice(*updatable_attributes)
# 保存する
user.save
end
end
# 更新を許可するカラムを定義
def self.updatable_attributes
["id", "name", "age"]
end
end
まず、
user = find_by(id: row["id"]) || new
でつまづいた。
調べると、
https://www.sejuku.net/blog/19044
nil判定を行っていることは理解
find_by(id: row["id"])がnilなら newをuserに代入している。
でも "new"とはなんだろう、インスタンスか?
公式document
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aRow.html
をみると、
CSV::Rowクラスの、newメソッドなのではないかと予想
であれば、
row.newを省略して書いている??
もう一個
row.to_hash.slice(*updatable_attributes)
がわからない。
rowは、csvの特定の行
それをto_hashでハッシュにしている
sliceで ["id", "name", "age"]のみ取扱たいが、
to_hashメソッドではを使うと、["id", "name", "age"]がハッシュのキー(あるいは値)として使われるのだろうか?
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aRow.htm
謎は深まる。
あと、*updatable_attributes
引数にアスタリスク付きのメソッドを指定している記法がわからない。