🙌

Rails CSVからインポートするコードを書いた

に公開

◆ ファイル
./exe.rb
./csvs/account.csv
./csvs/user.csv

◆ exe.rb

csv_import = ->(klass, &block) do
  singular_name = klass.model_name.singular
  logical_to_physical = klass.column_names.index_with { |attr| klass.human_attribute_name(attr) }.invert
  CSV.foreach("#{__dir__}/csvs/#{singular_name}.csv", headers: true) do |row|
    attributes = {}
    row.each do |key, value|
      physical_key = logical_to_physical[key]
      attributes[physical_key] = block.nil? ? value : block.call(physical_key, value)
    end
    klass.create!(attributes)
  end
end

# 担当者
csv_import.call(Account)

# 会員
csv_import.call(User) do |physical_key, value|
  case physical_key
  when 'status' # enumerizeジェム対応
    User.send(physical_key).values.find { |val| val.text == value }
  else
    value
  end
end

◆ account.csv

名前,自己紹介
田中,よろしく!
佐藤,...
上田,こんにちは!

◆ user.csv

名前,ステータス
田中,出席
佐藤,欠席
上田,早退

Discussion