使用额外列表从CSV文件创建用户

时间:2016-01-14 21:03:59

标签: ruby-on-rails csv gmaps4rails

当前项目的一部分我正在努力将csv文件上传到我的Web服务器,我想用它来为gmaps4rails创建用户/点。然而,我的CSV文件不仅仅包含我需要的lng lat和title字段作为新用户的参数。 我还可以使用row.to_hash函数吗?我也试过User.latitude = row.to_hash [' lat']等来获取我需要的col

另外,我很困惑把它放在哪里。我尝试了控制器和模型,无论哪种方式apache都给了我"我们很抱歉"页面,并让我查看日志,它没有给我任何可用于跟踪问题的信息。这让自己很难解决问题。

require 'csv'    

CSV.foreach('lib/data/cur.csv', :headers => true) do |row|
  User.create!(row.to_hash)
end

我的CSV示例 - col A-E不需要绘制点 - 我是否应该将它们作为col添加到架构中,所以我可以使用row.to_hash?

ID,lat,A,lng,B,C,D,E

$26A8,3023.1214,N,9744.5808,W,0.78,179.75,08102,U
$26A9,3023.0842,N,9744.6805,W,0.78,179.75,08102,U
$26AA,3022.9717,N,9744.5025,W,0.78,179.75,08102,U

编辑:这是我的方法在用户模型中的当前迭代

    CSV.foreach('lib/data/cur.csv', headers: true) do |row|
      user = find_by_id(row['ID']) || new
      attributes = {latitude: row['lat'].to_f, longitude: row['lng'].to_f, title: row['ID'].to_hash}
      begin
        User.create!(attributes)
      rescue => e
        "User failed to create with #{attributes} attributes because of #{e.message}"
      end
    end
  end

1 个答案:

答案 0 :(得分:0)

如果您不需要这些值,请不要将它们存储在数据库中。要避免存储所有值,您可以执行以下操作:

CSV.foreach('lib/data/cur.csv', :headers => true) do |row|
  User.create!(lat: row['lat'].to_f, lng: row['lng'].to_f)
end

至于放置它的位置,我会将它放在seeds.rb文件或rake任务中。如果应用程序要求用户按预期运行,则将它们放入种子中。如果您只是创建数据,那么我会在rake任务中执行此操作。您可能还想添加一些错误处理,因为创建CSV的任何人/任何人都不会是完美的。

所以

CSV.foreach('lib/data/cur.csv', :headers => true) do |row|
  attributes = {lat: row['lat'].to_f, lng: row['lng'].to_f}
  begin
    User.create!(attributes)
  rescue => e
    "User failed to create with #{attributes} attributes because of #{e.message}"
  end
end