我已经设法在Rails 4应用上获得CSV导入功能(基于this repo)。问题是在我的开发系统上,导入似乎正常工作,但在生产中,所有记录都会重复。请参阅下面的现有代码什么可能导致重复的想法?所有记录仅在CSV中显示一次,所有记录都有空白ID列,因为我希望系统分配分配。
books_controller.rb
def import
begin
Book.import(params[:file])
redirect_to root_url, notice: "Books imported."
rescue
redirect_to root_url, notice: "Invalid CSV file format."
end
end
def create
@book = Book.new(book_params)
@book.save
save_previews(params[:previews])
respond_with(@book)
end
def save_previews images
if images
images.each_value { |image|
@book.previews.create(image: image)
}
end
end
book.rb
def self.import(file)
CSV.foreach(file.path, headers: true, :encoding => 'utf-8') do |row|
product_hash = row.to_hash
product = Book.where(id: product_hash["id"])
if product.count == 1
product.first.update_attributes(product_hash)
else
Book.create!(product_hash)
end # end if !product.nil?
end # end CSV.foreach
end # end self.import(file)
的routes.rb
resources :books do
get "books/:page", :action => :index, :on => :collection
resources :comments
collection do
post :import
end
end
用户#show.html.erb
<% if user_signed_in? && current_user.super_admin? %>
<%= form_tag import_books_path, multipart: true do %>
<div class="form-group">
<%= file_field_tag :file %>
<%= submit_tag "Import CSV", class: "form-control" %>
</div>
<% end %>
<% end %>
答案 0 :(得分:1)
您希望使用active record validations来确保不会重复。这将是uniqueness
验证,以确保只有一个记录具有该属性。您将需要该属性的范围将所有其他属性绑定在一起。
这是一个简单的例子:
class Book < ActiveRecord::Base
validates_uniqueness_of :title, scope: :product_id
end