1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

rails csv ファイル読み込み トライ

Last updated at Posted at 2020-08-19

【Ruby on Rails】CSVインポート
[Rails上で、CSVファイルを読み込んでみた]
(https://qiita.com/m-shin1/items/7e8cdea2644e47b87fbf)
[【Rails】CSVファイルからデータをインポート]
(https://qiita.com/d0ne1s/items/d49423796dd1c801afd3)

これを参考にトライ

結果その通りにやったらできました。
(投稿者様、ありがとうございます)

だが、rubyの文法でつまづく。
だれかわかる方いらっしゃたら助けていただけるとありがたいです。

app/controllers/users_controller.rb
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メソッドであることはわかった。

app/model/user.rb
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
引数にアスタリスク付きのメソッドを指定している記法がわからない。

1
1
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?