foreachメソッド/attributesメソッド/to_hashメソッド, sliceメソッド/CSVデータのインポート機能

foreachメソッド

foreachメソッドを使ってCSVファイルを1行ずつ読み込ませます。

CSVライブラリには、ファイル全体を一度に読み込むreadメソッド、一行ずつ読み込むforeachメソッド、CSV形式の文字列から読み込むparseメソッドがあります。

大量のデータをCSVから一度に取得してしまうと、メモリに大量のデータが展開されてしまい、パフォーマンスが低下してしまいます。 この場合 foreach メソッドを使って分割して取得することでパフォーマンスの低下を防ぐことができます。

【参照ページ】

RubyでCSVファイルを読み込む方法を現役エンジニアが解説【初心者向け】

Railsでパフォーマンスを低下させないために気をつけること

foreachメソッド

Rubyリファレンスマニュアル IO.foreach

attributesメソッド

attributesメソッドは、特定のattributeを変更(更新)するメソッドです。ちなみに、このattributesメソッドはオブジェクトの変更をしただけで、DBには保存されていません。

> @task
=> #<Task:0x00007fd2a6fb60c8
 id: 1,
 name: "ラグビー観戦",
 description: "日本 vs 南アフリカ">

> @task.attributes = { name: "Hoge", description: "Fuga vs Fuga"}
=> {:name=>"Hoge", :description=>"Fuga vs Fuga"}

> @task
=> #<Task:0x00007fd2a6fb60c8
 id: 1,
 name: "Hoge",
 description: "Fuga vs Fuga">

参照:Active Recordのattributesの更新メソッド

to_hashメソッド, sliceメソッド

> hash = { a: 1, b: 2, c: 3, d: 4 }
=> {:a=>1, :b=>2, :c=>3, :d=>4}
[25] pry(main)> hash.to_hash
=> {:a=>1, :b=>2, :c=>3, :d=>4}
[26] pry(main)> hash.slice(:a, :d)
=> {:a=>1, :d=>4}

【参照ページ】

to_hash (Hash)

ハッシュスライス(Hash#slice)

CSVデータのインポート機能

  def self.csv_attributes
    %w(name description created_at updated_at)
  end

  def self.import(file)
    CSV.foreach(fale.path, headers: true) do |row|
      task = new
      task.attributes = row.to_hash.slice(*csv_attributes)
      task.save!
    end
  end

csv_attributesメソッドの戻り値の配列ないの要素をそれぞれ引数に指定する書き方で、下記の書き方で記述しているのと同じ意味になる。

slicd("name", "description", "created_at", "update_at")