2016-05-19 15 views
1

私は、Rails 4アプリケーションでCSVインポートを(this repoに基づいて)動作させることができました。私の開発システムでは、インポートが正しく動作するように見えますが、運用環境ではすべてのレコードが重複してしまうという問題があります。以下の既存のコードを参照してください。何が重複を引き起こしている可能性がありますか?すべてのレコードはCSVに一度だけ表示され、システムに割り当てを割り当てたいので空のID列がすべてあります。Rails CSVインポート重複レコード

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

私はアクティブレコードyesを使用しています。 – user3141095

答えて

1

active record validationsを使用して重複がないことを確認します。これは、その属性を持つレコードが1つだけであることを確認するためにuniqueness検証になります。その属性のスコープで他のすべての属性を結びつけることができます。クラス定義とその他もろもろを維持するために有用であるあなたのコードで

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

タイトルは必ずしも一意ではありません。同じ情報(同じタイトル、日付、作家、アーティストなど)を持つ複数の製品が存在する可能性があり、唯一の違いはメモフィールドと画像フィールドです。現在、管理インターフェースを介して単一のレコードを追加している場合は、クリップを使用して(画像フィールド)経由で、または背景のクリップで処理するリンク(image_remote_url)を介して画像をアップロードできます。これはCSV経由で画像をアップロードするための唯一の方法であるので エンド をPRODUCT_ID: クラス帳 user3141095

+0

Dbz、素晴らしい提案。私はimage_remote_urlを独自のフィールドにしました。これは電荷のように機能します。 – user3141095