hene

hene.dev

CSV を利用する Rake タスク

CSV を利用する Rake タスク

CSV を使ってモデルのデータを更新する rake タスクを作ってみる。

db/fixtures/csv/transfer_player.csv

id, team
1, 川崎フロンター
2, ヴィッセル神
3, 浦和レッ
# lib/tasks/transfer_player.rake
# frozen_string_literal: true

require 'csv'

namespace :transfer_player do
  desc '移籍した選手の選手名を "選手名(移籍先)" に変更'
  task name_and_destination: :environment do
    csv = Rails.root.join('db', 'fixtures', 'csv', 'transfer_player.csv')

    ActiveRecord::Base.transaction do
      CSV.foreach(csv, headers: true) do |data|
        player = Player.find(data['id'])
        player.update!(name:  "#{player.name}(#{data['team']})") unless player.name.include?('(')
        puts "#{player.id}: #{player.name}"
      end
    end
  end
end

CSV.foreach(csv, headers: true)CSV の中身を取れる。

CSV.foreach(csv, headers: true) do |data|
  player = Player.find(data['id'])
  ...
end

上記のように書くと、CSV の各行の値が data に入ってくる。 data['id']data['team'] で、CSV の 1 行目に書いている項目に当てはまるものを取れる。

参考

  • 先輩のコード

関連記事