foreachメソッド/attributesメソッド/to_hashメソッド, sliceメソッド/CSVデータのインポート機能
foreachメソッド
foreachメソッド
を使ってCSVファイルを1行ずつ読み込ませます。
CSVライブラリには、ファイル全体を一度に読み込むreadメソッド、一行ずつ読み込むforeachメソッド、CSV形式の文字列から読み込むparseメソッドがあります。
大量のデータをCSVから一度に取得してしまうと、メモリに大量のデータが展開されてしまい、パフォーマンスが低下してしまいます。 この場合 foreach メソッドを使って分割して取得することでパフォーマンスの低下を防ぐことができます。
【参照ページ】
RubyでCSVファイルを読み込む方法を現役エンジニアが解説【初心者向け】
Railsでパフォーマンスを低下させないために気をつけること
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}
【参照ページ】
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")