Ruby导入csv时跳过现有记录

时间:2017-08-22 18:10:02

标签: ruby-on-rails ruby excel csv

我的问题是我必须导出excel表,将一些行保存到数据库而不会出现重复或冗余 所以我开始导入CSV而不是XLS然后当我完成时我可以解析xls 这是我的型号代码:

require 'csv'
class Machine < ActiveRecord::Base
  def self.assign_row(row)
  a, b, c, d = row
  @c = c.slice(1,4)
 Machine.create(name: c, mid: @c)
   end
 def self.import(file)
 CSV.foreach(file.path) do |row|
  machine = Machine.assign_row(row)
    end
  end
 end     

在machines_controller中导入方法

 def import
 count = Machine.import params[:file]
 redirect_to machines_path, notice: "file imported successfully!"
  end     

迁移代码

 def change
 create_table :machines do |t|
 t.string :name
 t.string :mid
 t.timestamps null: false
 end
  add_index :machines, :name, :unique => true
 end     

和视图代码

 <%= form_tag import_machines_path, multipart: true do %>
 <%= file_field_tag :file %>
 <%= submit_tag "upload" %>
 <% end %>    

路由

  Rails.application.routes.draw do
 resources :errors
 resources :machines do
  collection do
     post :import
    end
   end
  root "machines#index
   end         

任何关于如何跳过重复记录从保存到数据库的想法将不胜感激 感谢

1 个答案:

答案 0 :(得分:1)

唯一标识符:  为避免重复记录保存到数据库,您应该维护除主键之外的唯一标识符。这有助于您识别数据库中是否已有记录,如果可用,您可以再次保存该记录。

我猜你可以在这种情况下使用name,对于数据库中的每条记录都应该是唯一的。在模型中编写唯一性验证以实现此目的。

更改后:

 validates_uniqueness_of  :name

 def self.assign_row(row)
   a, b, c, d = row
   @c = c.slice(1,4)
   machine = Machine.find_by(name: c)
   Machine.create(name: c, mid: @c) if machine.blank?
 end

希望它有所帮助!! 谢谢。