Есть
activerecord-import, который делает примерно то что вы хотите сделать, только без Ruby Object Mapper.
Если у вас PG, то для него есть команда copy from csv, ее можно использовать как-то так:
task :ips, [:filename] => :environment do |_, args|
filename = args[:filename] || Rails.root.join(*%w(tmp geoip cidr_optim.txt))
file = File.new(filename, 'r', encoding: 'windows-1251')
puts "Import #{filename}"
csv = CSV.new(file,
col_sep: "\t",
quote_char: '$',
headers: [:range_begin, :range_end, :title, :country, :city_id]
)
GeoIp.transaction do
connection = ActiveRecord::Base.connection_pool.checkout
begin
sql = <<-SQL
COPY geo_ips(ip_range, country, city_id)
FROM STDIN
WITH CSV NULL '-'
SQL
pg_exec_with_stdin(connection, sql) do
line = csv.shift
if line
line = CSV::Row.new(
[],
[
"[#{line[:range_begin]},#{line[:range_end].to_i + 1})",
line[:country],
line[:city_id]
]
)
end
line.try(:to_s)
end
ensure
ActiveRecord::Base.connection_pool.checkin(connection)
end
end
end
end
def pg_exec_with_stdin(conn, sql)
raw = conn.raw_connection
raw.exec(sql)
while (line = yield)
raw.put_copy_data line
end
raw.put_copy_end
while raw.get_result do; end # very important to do this after a copy
end
UPD: добавил pg_exec_with_stdin