1

我的 rails 应用程序具有 CSV 上传功能。它上传电子邮件的 CSV 文件并将其保存在客户数据库中。

这是我上传 CSV 的看法:

           <%= form_tag import_customers_path, multipart: true do %>
                 <%= file_field_tag :file %>
                 <%= submit_tag "Import" %>
           <% end %>

这是上传 CSV 的客户模型:

    def self.to_csv(options = {})
        CSV.generate(options) do |csv|
            csv << column_names
            all.each do |customer|
                csv << customer.attributes.values_at(*column_names)
            end
        end
    end

    def self.import(file)
      CSV.foreach(file.path, headers: true) do |row|
        Customer.create! row.to_hash
      end
    end

我在控制器中的导入操作是:

  def import
  current_user.customers.import(params[:file])
  redirect_to customers_path, notice: "Users imported."
  end

这在 localhost 上运行良好,但在服务器上我在上传 CSV 时遇到错误:

   CustomersController# (ActiveRecord::RecordInvalid) "Validation failed: Email has already been taken"

它适用于一个 CSV 文件,而不适用于其他文件。

编辑:

刚刚发现,我的数据库有重复的条目。而且我对数据库进行了唯一性验证。实际上用户可以上传 CSV。所以我希望他们的记录是唯一的,但有些用户可能有共同的记录。

那么有人可以告诉我如何为用户生成唯一记录吗?数据库中的记录可能是多余的,但每个用户都有唯一的记录,没有重复的条目。

谢谢你。

4

1 回答 1

0

似乎很明显(至少对我而言)您正在尝试创建一个已经有Customer记录具有该电子邮件地址的客户。我看不到您的验证,所以我假设该模型中同时存在 avalidates_presence_of和。validates_uniqueness_ofCustomer

确认您的 CSV 文件不包含具有相同电子邮件地址的客户。

于 2013-08-07T05:40:45.763 回答