2016-05-19 2 views
1

Мне удалось получить импорт CSV (на основе this repo) в приложении Rails 4. Проблема в том, что в моей системе разработки импорт работает правильно, но в производстве все записи дублируются. См. Действующий код ниже. Любые идеи, которые могут вызвать дублирование? Все записи отображаются только в CSV, все имеют пустые столбцы идентификаторов, так как я хочу, чтобы система назначила назначающие.Rails CSV Import Duplicating Records

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

В коде полезно держать определения классов и этажерку. Например, я хотел убедиться, что вы используете активную запись. – Dbz

+0

Я использую активную запись да. – user3141095

ответ

1

Вы хотите использовать active record validations, чтобы убедиться, что у вас нет дубликатов. Это будет проверка uniqueness, чтобы убедиться, что есть только одна запись с этим атрибутом. Вам понадобится область действия для этого атрибута, чтобы связать все другие атрибуты вместе.

Вот простой пример:

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

названия не обязательно уникальны. может быть несколько продуктов с одинаковой информацией (одно и то же название, дата, писатель, художник и т. д.), и единственное различие - это поля примечаний и изображений. В настоящее время, если я добавляю отдельные записи через интерфейс администратора, я могу загрузить изображение через (поле изображения) с помощью скрепки или по ссылке (image_remote_url), которая затем обрабатывается с помощью paperclip в фоновом режиме. Может быть, я могу сделать: класса Book user3141095

+0

Dbz, большое предложение. Я создал image_remote_url уникальное поле и работает как заряд. – user3141095