はじめに
Railsでの開発でレコードに一意性制約を設けるにあたって、マイグレーションファイルに記述してスキーマに登録しました。
ですので、重複するレコードデータは自動的に保存されるときに弾かれるものと思い込んでいたために、 Mysql2::Error: Duplicate entry for key..
というエラーに遭遇しました。
その解決策を備忘録として書き記します。
エラー公開
class CreateFriends < ActiveRecord::Migration[5.2]
def change
create_table :friends do |t|
t.integer :from
t.integer :to
t.timestamps null: false
end
add_index :friends, :from
add_index :friends, :to
add_index :friends, [:from, :to], unique: true
end
end
上記のように、friends
テーブルにfrom
カラムとto
カラムの組み合わせが一意であるようにインデックスに登録しました。
問題発生
これでマイグレーションファイルを実行し、データを保存しようとしたところ、 Mysql2::Error: Duplicate entry for key..
エラーに遭遇しました。
$ rake db:migrate
def add_friend
@friend = Friend.new(from: ..., to: ...)
@friend.save
.
.
.
end
end
コードは端折っておりますが、上記のような感じです。一意性制約を設けたために、同じカラム値の組み合わせデータをsave
メソッドで保存しようとすると、エラーが発生しました。
解決
下記コード一行をfriend
モデルに追記するとエラーは無くなりました。
class Friend < ApplicationRecord
validates :from, uniqueness: { scope: :to }
end
スキーマに記すとともに、バリデーションの記述をモデルにも書く必要があったのですね。
ちなみに上記のコードは複数のフィールド(カラム)で一意になるようにチェックしたい時の記述になります。
エラー記事まとめ
*2018/12/04時点で、まだ2記事しかございません。これからストックしていきます。
みなさんが同様のエラーに遭遇した時の一助になると幸いです。
Mysql2::Error::ConnectionErrorの謎を解明!
undefined local variable or method display_meta_tags for..
終わりに
同じエラーに遭遇してこの記事が役にたったよー、って方はいいねしてくれると嬉しいです(^^)