Skip to content

Instantly share code, notes, and snippets.

@tungd
Last active December 18, 2015 17:39
Show Gist options
  • Save tungd/5820238 to your computer and use it in GitHub Desktop.
Save tungd/5820238 to your computer and use it in GitHub Desktop.
Much faster (~x300) master data import for Rails
def create_master model_class, &block
return unless block_given?
csv = "#{Rails.root}/db/masters/#{model_class.name.split('::').last.underscore}.csv"
model_class.destroy_all
model_class.create! CSV.open(csv).map(&block)
end
def import_master_unsafe model_class, &block
return unless block_given?
csv = "#{Rails.root}/db/masters/#{model_class.name.split('::').last.underscore}.csv"
columns = block.call(CSV.open(csv).first).keys
ActiveRecord::Base.connection.execute <<-EOF
LOAD DATA INFILE "#{csv}" REPLACE
INTO TABLE `#{model_class.table_name}`
FIELDS TERMINATED BY ','
(#{columns.join(", ")})
SET `created_at` = '#{Time.current.to_s(:db)}', `updated_at` = '#{Time.current.to_s(:db)}';
EOF
end
namespace :master do
desc "Create master data"
task import: :environment do
puts "create ContactType"
create_master M::ContactType do |contact_type|
{id: contact_type[0], name: contact_type[1]}
end
puts "create JapanAddress"
create_master_unsafe M::JapanAddress do |japan_address|
{ code: japan_address[0], address1: japan_address[1], address2: japan_address[2], address3: japan_address[3]}
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment