从带有额外列的 CSV 文件创建用户

Creating users from a CSV file with extra col

我正在处理的当前项目的一部分将 csv 文件上传到我想用来为 gmaps4rails 创建 Users/points 的 Web 服务器。然而,我的 CSV 文件不仅仅是我需要的 lng lat 和 title 字段作为新用户的参数。 我还能使用 row.to_hash 功能吗?我还尝试了 User.latitude = row.to_hash['lat'] 等只获取我需要的 col

此外,我不知道该把它放在哪里。我尝试了控制器和模型,无论哪种方式,apache 都只给了我 "we are sorry" 页面,并要求我查看日志,但没有提供任何可用于跟踪问题的信息。这使得自我解决问题变得非常困难。

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

A8,3023.1214,N,9744.5808,W,0.78,179.75,08102,U
A9,3023.0842,N,9744.6805,W,0.78,179.75,08102,U
AA,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

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

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 任务中进行。您可能还想添加一些错误处理,因为 whoever/whatever 正在创建您的 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