Well, when I had to do this recently, I used FasterCSV and ActiveRecord inside a Rails migration which began like:
gem 'fastercsv', '>=1.2'
# on TxD, it's unpacked as a plugin!
$: << File.expand_path('vendor/plugins/fastercsv-1.2.0/lib')
class ImportResearchData < ActiveRecord::Migration
And had a part that was like:
:headers => :first_row,
:converters => :numeric) do |csv|
csv.each do |row|
if csv.lineno % 1000 == 1
$stderr.print "\r%5d ..." % csv.lineno
row.each do |header,value|
...and used the block variables to create one of three different records, if needed, through ActiveRecord models. You should be able to figure out how to get started. Note that if your CSV file is one-record equals one-database-row, your loop will likely be quite a bit simpler than mine. (My CSV data was essentially the result that would come from a three table join of the original database to which I had no access.)