私の 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 をアップロードできます。したがって、レコードを一意にしたいのですが、一部のユーザーは共通のレコードを持っている可能性があります。
では、ユーザーごとに一意のレコードを生成する方法を教えてもらえますか? データベース内のレコードは重複する可能性がありますが、すべてのユーザーには重複するエントリのない一意のレコードがあります。
ありがとうございました。