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

これはローカルホストではうまく機能していますが、サーバーでは CSV のアップロード中にエラーが発生します:

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

1 つの CSV ファイルで機能し、他のファイルでは機能しません。

編集:

私のデータベースには重複したエントリがあることがわかりました。そして、データベースで一意性を検証しています。実際、ユーザーは CSV をアップロードできます。したがって、レコードを一意にしたいのですが、一部のユーザーは共通のレコードを持っている可能性があります。

では、ユーザーごとに一意のレコードを生成する方法を教えてもらえますか? データベース内のレコードは重複する可能性がありますが、すべてのユーザーには重複するエントリのない一意のレコードがあります。

ありがとうございました。

4

1 に答える 1

0

Customerその電子メール アドレスを持つレコードが既に存在する顧客を作成しようとしていることは (少なくとも私には) 明らかです。私はあなたの検証を見ることができないので、そのモデルにはvalidates_presence_ofとの両方があると仮定します。validates_uniqueness_ofCustomer

CSV ファイルに同じメール アドレスを持つ顧客が含まれていないことを確認します。

于 2013-08-07T05:40:45.763 に答える