2016-01-23 51 views
0

上午尝试导入选项卡式文件并使用Ruby CSV。麻烦的是添加到数据库的值返回零,我不明白为什么。模型填充,但CSV导入后的值为零

这里是我的方法:

require 'csv' 

desc "Import GB.full from csv file" 
task :import => [:environment] do 

    file = "codes.csv" 

    CSV.foreach(file, :col_sep => "\t") do |row| 
    Place.create { 
     country_code = row[0], 
     postal_code = row[1], 
     place_name = row[2], 
     admin_name_1 = row[3], 
     admin_code_1 = row[4], 
     admin_name_2 = row[5], 
     admin_code_2 = row[6], 
     admin_name_3 = row[7], 
     admin_code_3 = row[8], 
     latitude = row[9], 
     longitude = row[10], 
     accuracy = row[11] 
    } 
    puts row[0] 
    end 

end 

这里是我的模型条目从Rails的控制台一个片段:

irb(main):030:0> Place.all 
    Place Load (3.8ms) SELECT "places".* FROM "places" 
=> #<ActiveRecord::Relation [#<Place id: 1, country_code: nil, postal_code: nil, place_name: nil, admin_name_1: nil, admin_code_1: nil, admin_name_2: nil, admin_code_2: nil, admin_name_3: nil, admin_code_3: nil, latitude: nil, longitude: nil, accuracy: nil, created_at: "2016-01-23 18:10:40", updated_at: "2016-01-23 18:10:40">, #<Place id: 2, country_code: nil, postal_code: nil, place_name: nil, admin_name_1: nil, admin_code_1: nil, admin_name_2: nil, admin_code_2: nil, admin_name_3: nil, admin_code_3: nil, latitude: nil, longitude: nil, accuracy: nil, created_at: "2016-01-23 18:10:40", updated_at: "2016-01-23 18:10:40">, #<Place id: 3, country_code: nil, postal_code: nil, place_name: nil, admin_name_1: nil, admin_code_1: nil, admin_name_2: nil, admin_code_2: nil, admin_name_3: nil, admin_code_3: nil, latitude: nil, longitude: nil, accuracy: nil, created_at: "2016-01-23 18:10:40", updated_at: "2016-01-23 18:10:40">, #<Place id: 4, country_code: nil, postal_code: nil, place_name: nil, admin_name_1: nil, admin_code_1: nil, admin_name_2: nil, admin_code_2: nil, admin_name_3: nil, admin_code_3: nil, latitude: nil, longitude: nil, accuracy: nil, created_at: "2016-01-23 18:10:40", updated_at: "2016-01-23 18:10:40"> 

提前感谢!在这条线

Place.create {...} 

回答

2

问题这条线是由红宝石interpetended作为调用Place类的方法与create。如果你想通过哈希值作为参数传递给方法create如果您想使用块语法应该写成

Place.create({country_code: row[0]...}) 

,那么你必须通过一个产生对象,这个对象是这样的设置属性:

Place.create { |place| place.country_code = row[0] ...} 

请参阅docs了解更多信息。

+0

谢谢我将深入研究这些文档。 – Stoob