我的问题是我必须导出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
任何关于如何跳过重复记录从保存到数据库的想法将不胜感激 感谢
答案 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
希望它有所帮助!! 谢谢。