質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

4668閲覧

ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraintエラーで困っています。

popi06

総合スコア3

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/04/14 11:18

railsでrails db:seedを実行しようとしたら以下のエラーが発生しました。どこを触ってこうなったのかわからない為、混乱しています。
初学者なのでなるべくわかりやすく、どの点を修正した方が良いか教えていただきたいです。

発生したエラー

rails aborted! ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: categories.id
一番最近のmigration class AddcircleUserIdToApplies < ActiveRecord::Migration[6.0] def change add_column :applies, :circle_user_id, :integer end end

seeds.rb

require "csv"

CSV.foreach('db/category.csv') do |row|
Category.create(:id => row[0], :name => row[1], :ancestry => row[2])
end

メインのサンプルユーザーを1人作成する

User.create!(name: "User",
email: "example@example.com",
password: "0000000",
password_confirmation: "0000000",
admin: true,
activated: true,
activated_at: Time.zone.now)

# 追加のユーザーをまとめて生成する

99.times do |n|
name = Faker::Name.name
email = "example-#{n+1}@railstutorial.org"
password = "password"
User.create!(name: name,
email: email,
password: password,
password_confirmation: password)
end

users = User.order(:created_at).take(6)
50.times do
content = Faker::Lorem.sentence(word_count: 5)
users.each { |user| user.microposts.create!(content: content) }
end

users = User.all
user = users.first
following = users[2..50]
followers = users[3..40]
following.each { |followed| user.follow(followed) }
followers.each { |follower| follower.follow(user) }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

データベースにはユニーク制約(UNIQUE Constraint)というものがあります。
同じ値をINSERTできないようにするためのものです。

今回は ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: categories.id

という事なので、categoriesテーブルのidが重複してますよというエラーです。

Railsの前にSQLを理解する必要があって、レコードを保存するといった場合SQLではこの2つを使い分ける必要があります。
INSERT => 新規にレコードを作成する
UPDATE => 既存のレコードの値を更新する

モデルのcreate, create!はINSERTに対応していて、
update, update!はUPDATEに対応しています。

例えば、id=1のレコードが既に存在している状態で、create!(id: 1, ...)を実行するとエラーになります。
PRIMARY KEYであるidは、自動的にユニーク制約=重複禁止のルールがあるからです。
今回はこれに該当しています。

ちなみに、save, save!はidに値が入っているかどうかで新規かどうかを判断してINSERT/UPDATEの発行を自動でしてくれます。

CSVからデータを更新する場合、すでにレコードがあるかどうかを判断しないといけません。
なのでこういう感じになると思います。

ruby

1CSV.foreach('db/category.csv') do |row| 2 # レコードが既に存在しているか確認する必要があるので、idで検索 3 # いきなりcreate!しない 4 category = Category.find_by(id: row[0]) 5 6 # レコードがないので新規 7 unless category 8 category = Category.new 9 end 10 11 # id以外の値を設定して 12 category.attributes = { 13 name: row[1], ancestry: row[2] 14 } 15 # 保存 16 category.save! 17 18 ... 19end

投稿2021/04/14 12:01

mingos

総合スコア4207

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popi06

2021/04/14 12:15

とても丁寧に解説していただきありがとうございます....!!!! わかりやすく勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問