【Rails】🔰 ActiveRecord::RecordNotUniqueエラーの解決方法
はじめに
この記事では、Railsのテスト実行中に発生したエラーActiveRecord::RecordNotUnique
について、その原因と修正方法を簡潔に説明します。
※Rails Tutorial の第14章を進めていて出会いました。(多くのエラーは成長機会と捉えているので感謝🎉)
エラー内容
テスト実行中に以下のエラーが発生しました。
ERROR ValidLoginTest#test_valid_login (4.73s)
Minitest::UnexpectedError: ActiveRecord::RecordNotUnique: RuntimeError: UNIQUE constraint failed: relationships.follower_id, relationships.followed_id
このエラーは、relationships
テーブルにおいて、follower_id
とfollowed_id
の組み合わせが一意でなければならないという制約(UNIQUE制約)が設定されているにもかかわらず、同じデータが複数回挿入されてしまったために発生しました。
Raised when a record cannot be inserted or updated because it would violate a uniqueness constraint.
原因
テストデータのfixtures
において、follower_id
とfollowed_id
が同じ値になっているエントリが重複していたため、UNIQUE制約に引っかかっていました。
具体的には、以下のように両方のfixuturesで同じユーザー(follower_id: 1
、followed_id: 1
)が使用されていたためです。
one:
follower_id: 1
followed_id: 1
two:
follower_id: 1
followed_id: 1
修正方法
異なるfollower_id
およびfollowed_idを指定することで、UNIQUE制約に違反しないようにします。
以下のように修正することで、テストが正常に動作するようになります。
one:
follower_id: 1
followed_id: 1
two:
follower_id: 2
followed_id: 2
参考
ちなみに
以下から、「備え付けの家具や設備」というイメージが湧くかもしれません。お風呂など、家の中で動かせない固定されたものを指すことが多いです。
a permanently fixed piece of furniture in a house, such as a bath, that would not be taken by someone when moving to a new home:
日本語の辞書でも、同じような説明が見られます。
このように考えると、「元々そこに置かれているもの」や「備え付けられているもの」という意味から、テスト用に事前に定義されたデータ、つまり「サンプルデータ」に通じるのではないか、と勝手に解釈しましたが、いかがでしょうか?笑
フィクスチャ(fixture)とは、いわゆるサンプルデータを言い換えたものです。フィクスチャを使うことで、事前に定義したデータをテスト実行直前にtestデータベースに導入することができます。
まとめ
UNIQUE制約エラーは、データの一意性を保つために重要です。fixuturesの値が重複していないかを確認して適切に設定することで、このエラーを回避できます。
最後に
ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉
noteでも記事を執筆していますので、ぜひチェックしてみてください。
他にもこのようなことについて記載しているのでお読みいただければ幸いです。
最後までお読みいただき、誠にありがとうございました!
Discussion