【问题标题】:How to ignore duplicates when I import xlsx file?导入 xlsx 文件时如何忽略重复项?
【发布时间】:2018-10-19 08:44:40
【问题描述】:

我正在做一个项目,我必须将一些 Phones 导入我的网站。每部手机都有一个 IMEI 和一个 ref_number。

但是,其中一些 Phones 已经在数据库中,这会使请求更长,并导致 Heroku 上的应用程序错误。

这是我的phones_controller.rb

def import_xlsx
  if params[:xlsx].nil?
    render :import_phones
  else
    filepath = params[:xlsx].path
    xlsx = Roo::Spreadsheet.open(filepath)
    xlsx = Roo::Excelx.new(filepath)
    xlsx.default_sheet = xlsx.sheets.first
    csv = xlsx.to_csv
    csv_options = { col_sep: ',', headers: :first_row, quote_char: '"' }
    csv_new = CSV.new(csv)
    CSV.parse(csv, csv_options) do |row|
      p = Phone.new(imei: row[0], ref_number: row[1])
      p.imei.gsub(/\s+/, "")
      if p.valid?
        p.save!
      else
        flash[:alert] = "#{p.imei}"
      end
    end
  redirect_to phones_import_path, notice: 'Votre fichier à bien été envoyer'
end

结束

那么,有没有办法做到这一点,或者让请求更快?

【问题讨论】:

  • JFYI,那个 gsub 什么都不做
  • 我同意@SergioTulentsev,你应该改用p.imei = p.imei.gsub(/\s+/,"")。哦,你可以将整个 if-else 重构为 flash[:alert] = "#{p.imei}" unless p.save

标签: ruby-on-rails ruby roo


【解决方案1】:

Phone 模型中,您可以像这样添加唯一性验证器:

validate :imei, uniqueness: true

这样,当您尝试保存手机时,它不会通过验证,也不会被保存。在这种情况下,它是重复字段的验证器。

More info on validators

【讨论】:

    猜你喜欢
    • 2014-02-24
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2016-03-03
    • 1970-01-01
    • 2016-10-22
    相关资源
    最近更新 更多