2012-10-17 62 views
1

我想在http://www.genesx.com/2012/06/import-csv-files-100x-faster-in-rails-3/軌Postgres的插入

我想從Postgres的最後插入的指數繼Jonaphin給出的示例CSV文件導入數據,但由於某些原因的代碼不工作。

def process_data!(file, survey_id) 
headers = [ 
    "zip_code", 
    "booking_date" 
] 
ActiveRecord::Base.establish_connection 

created_at = Time.now.strftime("%Y-%m-%d %H:%M:%S") 

CSV.foreach(file, {headers: :first_row}) do |row| 
    sql_keys = [] 
    sql_vals = [] 

    headers.each_with_index do |key, idx| 
    val = row[idx] 

    sql_keys << key 
    sql_vals << ActiveRecord::Base.connection.quote(val) 
    end 

    sql = " 
    INSERT INTO bookings (survey_id, #{sql_keys.join(', ')}, created_at, updated_at) 
    VALUES (#{survey_id}, #{sql_vals.join(', ')}, '#{created_at}', '#{created_at}') 
    " 

    booking_id = ActiveRecord::Base.connection.insert(sql) 

end 
end 

booking_id現在應該有最後插入行的ID,但由於某種原因,它是nil

我試着在控制檯中運行ActiveRecord::Base.connection.insert(sql),它工作正常(即它返回了我想要的ID)。

有人知道這裏發生了什麼問題嗎?是否有一些設置需要更改以允許postgres返回最後一個ID?

回答

1
INSERT INTO bookings (survey_id, #{sql_keys.join(', ')}, created_at, updated_at) 
VALUES (#{survey_id}, #{sql_vals.join(', ')}, '#{created_at}', '#{created_at}') 
returning survey_id 
+0

這很好用 - 謝謝! (雖然應該是「返回ID」) – cit

+0

我一直在使用類似的方法,但在Rails 4.1中,ActiveRecord :: Base.connection已被棄用,並且在SQL語句中使用'RETURNING id'時會引發錯誤。 – bayendor