♨️

【Rails】🔰 ActiveRecord::RecordNotUniqueエラーの解決方法

2024/10/23に公開

はじめに

この記事では、Railsのテスト実行中に発生したエラーActiveRecord::RecordNotUniqueについて、その原因と修正方法を簡潔に説明します。

※Rails Tutorial の第14章を進めていて出会いました。(多くのエラーは成長機会と捉えているので感謝🎉)

https://railstutorial.jp/chapters/following_users?version=7.0#sec-the_relationship_model

エラー内容

テスト実行中に以下のエラーが発生しました。

ERROR ValidLoginTest#test_valid_login (4.73s)
Minitest::UnexpectedError:         ActiveRecord::RecordNotUnique: RuntimeError: UNIQUE constraint failed: relationships.follower_id, relationships.followed_id

このエラーは、relationshipsテーブルにおいて、follower_idfollowed_idの組み合わせが一意でなければならないという制約(UNIQUE制約)が設定されているにもかかわらず、同じデータが複数回挿入されてしまったために発生しました。

Raised when a record cannot be inserted or updated because it would violate a uniqueness constraint.

https://api.rubyonrails.org/v7.2/classes/ActiveRecord/RecordNotUnique.html

原因

テストデータのfixturesにおいて、follower_idfollowed_idが同じ値になっているエントリが重複していたため、UNIQUE制約に引っかかっていました。

具体的には、以下のように両方のfixuturesで同じユーザー(follower_id: 1followed_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

参考

https://api.rubyonrails.org/v7.2/classes/ActiveRecord/RecordNotUnique.html

https://qiita.com/nanasi-1/items/ee1094cd92b16b02726a

https://railstutorial.jp/chapters/following_users?version=7.0#sec-the_relationship_model

ちなみに

以下から、「備え付けの家具や設備」というイメージが湧くかもしれません。お風呂など、家の中で動かせない固定されたものを指すことが多いです。

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:

https://dictionary.cambridge.org/dictionary/english/fixture

日本語の辞書でも、同じような説明が見られます。

https://ejje.weblio.jp/content/fixture

このように考えると、「元々そこに置かれているもの」や「備え付けられているもの」という意味から、テスト用に事前に定義されたデータ、つまり「サンプルデータ」に通じるのではないか、と勝手に解釈しましたが、いかがでしょうか?笑

フィクスチャ(fixture)とは、いわゆるサンプルデータを言い換えたものです。フィクスチャを使うことで、事前に定義したデータをテスト実行直前にtestデータベースに導入することができます。

https://railsguides.jp/testing.html#:~:text=フィクスチャ(fixture)とは,することができます。

まとめ

UNIQUE制約エラーは、データの一意性を保つために重要です。fixuturesの値が重複していないかを確認して適切に設定することで、このエラーを回避できます。

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉

noteでも記事を執筆していますので、ぜひチェックしてみてください。
https://note.com/take_lifelog/n/n58df7ce7af6f

他にもこのようなことについて記載しているのでお読みいただければ幸いです。

https://zenn.dev/take_tech/articles/275e5f4242973d

https://zenn.dev/take_tech/articles/374817f256ec9d

最後までお読みいただき、誠にありがとうございました!

Discussion