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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

2711閲覧

モデルテスト用のfixtureに外部キーを設置する方法

PartyKids

総合スコア65

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

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

0グッド

0クリップ

投稿2017/12/12 10:28

閲覧ありがとうございます!

テスト用のフィクスチャに外部キーを設定しようとすると、エラーが出てしまい困っています。
よろしくお願いいたします。

前提

3つのテーブル

動物テーブル中間テーブル分類テーブル
動物名分類ID分類名
中間テーブルID足の本数

例)
ゴリラの場合

動物テーブル中間テーブル分類テーブル
ゴリラ分類ID哺乳類
中間テーブルID

ruby

1### animal model 2belong_to animal_category 3 4### animal_categories 5has_many animals, dependent: :destroy 6belongs_to category 7 8[分類、足の本数] unique:true 9 10### category model 11has_many animal_categories, dependent: :destroy

問題点:

中間モデルをテストする際は、

ruby

1test/fixtures/categories.yml 2category1: 3 category_name: 哺乳類 4 5test/models/animal_category.rb 6def setup 7 @category = categories(:category1).id 8 @animal_category = AnimalCategory.new( 9 category_id: @category 10 leg_number: 2 11) 12end

で、上手く外部キーを設定することが出来ました。

しかし、動物モデルをテストしようと、

ruby

1test/fixtures/animal_categories.yml 2animal_category1: 3 category_id: <%= categories(:category1).id %> 4 leg_number: 2

を試してみたのですが上手くいきませんでした。
Model名: fixture定義名で設定できる事が分かったので、

ruby

1animal_category1: 2 category: category1 3 leg_number: 2

で試してみたら一回目は上手くいったのですが、二回目のテストをしようとすると**ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:**が出てしまいます。

rails db:migrate:resetをすればテストは通るのですが、2回目からまた同じエラーが出てしまいます。

fixtureの書き方が間違っているため、うまくDBのレコードが削除できていないのか、それともfixtureは良いが、モデルのリレーションがおかしいからエラーが出ているのか分かりません。

binding.pryをテスト内に入れて確かめようとしたのですが、そこでは止まらずエラーが出て終了してしまい、どうすれば解決出来るのかがわかりません。

よろしくお願いいたします!

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

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

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

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

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

guest

回答1

0

自己解決

rails実行ユーザーの権限が、Create DBだったため関連テーブルのレコードを削除することができませんでした。

**ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:**の他に、**Rails needs superuser privileges to disable referential integrity.**が出ている(見落としていました。。。)場合は、

linux

1su - rails実行ユーザー 2 3postgres -U 実行ユーザー名 postgres 4\du

でrails実行ユーザーの権限を確認してみてください。
rails実行ユーザーの権限にSuperuserが無い場合は、『PostgreSqlでスーパーユーザーを作成』で検索して、作成してください。

閲覧ありがとうございました!

投稿2017/12/13 02:06

PartyKids

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問