2017-07-12 13 views
1

私はこの紛らわしいエラーメッセージActiveRecord::RecordNotUniqueRailsの/ MySQLのActiveRecordの:: RecordNotUnique

は、これは私のモデルである:artisan.rb

class Artisan < ActiveRecord::Base 
    require 'csv' 

    validates :nom_entreprise, presence: true 
    validates :nom_entreprise_format_url, presence: true 
    validates :adresse_1, presence: true 
    validates :code_postal, presence: true 
    validates :ville, presence: true 
    validates :gps_latitude, presence: true 
    validates :gps_longitude, presence: true 
    validates :url_site_artisan, presence: true 
    validates :telephone, presence: true 

    csv_text = File.read('artisans.csv') 
    csv = CSV.parse(csv_text, :headers => true) 
    csv.each do |row| 
    Artisan.create!(row.to_hash) 
    end 
end 

コントローラ:

class ArtisansController < ApplicationController 
    def index 
    @artisans = Artisan.all 
    end 
end 

私もあなたを与えるschema.rb

create_table "artisans", force: :cascade do |t| 
    t.string "nom_entreprise",   limit: 255 
    t.string "nom",      limit: 255 
    t.string "prenom",     limit: 255 
    t.string "adresse_1",     limit: 255 
    t.string "adresse_2",     limit: 255 
    t.integer "code_postal",    limit: 4 
    t.string "ville",      limit: 255 
    t.float "gps_latitude",    limit: 24 
    t.float "gps_longitude",    limit: 24 
    t.string "description",    limit: 255 
    t.string "url_site_artisan",   limit: 255 
    t.string "url_voir_plus",    limit: 255 
    t.float "telephone",     limit: 24 
    t.string "nom_entreprise_format_url", limit: 255 
    t.boolean "visible_site_web" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    end 
少なくとも最後のではなく、で3210

、エラーメッセージ:

Started GET "/admin/artisans" for ::1 at 2017-07-12 11:40:37 +0200 
Processing by RailsAdmin::MainController#index as HTML 
    Parameters: {"model_name"=>"artisans"} 
[RailsAdmin] Could not load model Artisans, assuming model is non existing. (uninitialized constant Artisans) 
    (0.2ms) BEGIN 
    SQL (1.0ms) INSERT INTO `artisans` (`id`, `nom_entreprise`, `nom`, `prenom`, `adresse_1`, `adresse_2`, `code_postal`, `ville`, `gps_latitude`, `gps_longitude`, `description`, `url_site_artisan`, `url_voir_plus`, `telephone`, `nom_entreprise_format_url`, `visible_site_web`, `created_at`, `updated_at`) VALUES (10, 'La Brasserie du Baril', 'NULL', 'NULL', '4, Rue Champlain', 'NULL', 29200, 'Brest', 48.3818645, -4.529462500000022, 'NULL', 'http://www.brasseriedubaril.com', 'NULL', 9.0, 'la-brasserie-du-baril', 1, '2017-07-12 09:40:37', '2017-07-12 09:40:37') 
    (0.2ms) ROLLBACK 
Completed 500 Internal Server Error in 24ms (ActiveRecord: 1.4ms) 

ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry '10' for key 'PRIMARY': INSERT INTO `artisans` (`id`, `nom_entreprise`, `nom`, `prenom`, `adresse_1`, `adresse_2`, `code_postal`, `ville`, `gps_latitude`, `gps_longitude`, `description`, `url_site_artisan`, `url_voir_plus`, `telephone`, `nom_entreprise_format_url`, `visible_site_web`, `created_at`, `updated_at`) VALUES (10, 'La Brasserie du Baril', 'NULL', 'NULL', '4, Rue Champlain', 'NULL', 29200, 'Brest', 48.3818645, -4.529462500000022, 'NULL', 'http://www.brasseriedubaril.com', 'NULL', 9.0, 'la-brasserie-du-baril', 1, '2017-07-12 09:40:37', '2017-07-12 09:40:37')): 
    app/models/artisan.rb:17:in `block in <class:Artisan>' 
    app/models/artisan.rb:16:in `<class:Artisan>' 
    app/models/artisan.rb:1:in `<top (required)>' 

エラーメッセージ冒頭には、それが存在しない原因モデル「職人」を読み込むことができなかったと述べています。それは本当だ、私はrails g model Artisanを走ったこのモデルを作成するにはいないrails g model Artisans

最後の一つです:!エラーがadminインタフェースではなく、ビューで発生した(まだビューには何もありません)。 管理者のArtisanのコンテンツを確認してから退席し、エラーメッセージが表示されました。

何か助けがあれば幸いです。 :)

+1

あなたのcsvにはIDにも値があると思いますが、手動でDBに挿入しないでください。 'row.to_hash'はキー' ID'を持ち、スキップします。 Railsは 'row.to_hash.except(:id_column_name)'を使用してスキップするためにその列 – Abhi

+0

を処理しなければなりません –

答えて

0

SQLでは、PRIMARY KEY制約はデータベーステーブルの各レコードを一意に識別します。主キーはUNIQUE値を含む必要があり、NULL値を含むことはできません。また、表には主キーが1つしかない場合もあります。 デフォルトでは、Railsは一意の主キー(つまりid)をデータベースに保持しています。また、主キーの一意性も検証します。しかし、上記のコードはコードを使用して重複した 'id'を保存しようとしていますArtisan.create!(row.to_hash)

この問題は、作成中に「id」属性を省略することで修正できます。

csv.each do |row| 
    Artisan.create!(row.to_hash.except("id")) 
end 
+0

それは動作します!ありがとうございました。このコードは将来的には何の効果もありませんか?私がIDを操作しなければならないときのように? – justinedps26

+0

"id"カラムを使用して、ユーザ定義の値をレールに格納しない方が良いでしょう。あなたのCSVファイルの "id"列を別のものに置き換えます。その後、上記のコードは完全に動作します。 –

+0

私は各ステートメントが私のバックオフィスで問題を引き起こしていると思います。職人は、ページをリロードするたびに複製されます – justinedps26

関連する問題