Rails CSV导入重复记录

时间:2016-05-19 21:14:54

标签: ruby-on-rails ruby csv heroku import

我已经设法在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 %>

1 个答案:

答案 0 :(得分:1)

您希望使用active record validations来确保不会重复。这将是uniqueness验证,以确保只有一个记录具有该属性。您将需要该属性的范围将所有其他属性绑定在一起。

这是一个简单的例子:

class Book < ActiveRecord::Base
  validates_uniqueness_of :title, scope: :product_id
end