

## 仕様

  * students(生徒)
  * subjects(科目)
  * students_subjects(中間テーブル) 
    * student_id
    * subject_id

students_subjectsはmigrationファイルで外部キー制約をかけています。

## 問題

外部キー制約が働いてるかチェックしたいなーと思って、以下のように実行し`ActiveRecord::InvalidForeignKey`がraiseすることを期待したんですが、  
期待と違う結果になりました。

[code]

    student.students_subjects.create!(subject_id: 'dummy')
    # ActiveRecord::RecordInvalid:  Subjectを入力してください
    
[/code]

ちなみにidなのに文字列なのが問題なのかと思って実際存在しないidでやっても同じでした。

[code]

    student.students_subjects.create!(subject_id: 999)
    # ActiveRecord::RecordInvalid:  Subjectを入力してください
    
[/code]

rails公式をみても、insertのときも発生するってあるのでおかしいなと感じています。  
<https://api.rubyonrails.org/v6.1.0/classes/ActiveRecord/InvalidForeignKey.html>

何か原因、手がかり等わかりそうな方はアドバイスいただけますと幸いでございます。


CC BY-SA 4.0
2022-02-03T22:10:06.487
86129
2022-08-19T01:58:28.217
2022-02-04T00:22:07.753
40650
40650
question
ruby-on-rails rails-activerecord
ActiveRecord::InvalidForeignKey が raiseしてくれない


現在は下記のようになっているかと思います。  
この場合自動的にstudent_id(存在するstudentのid)が必須になるため  
`ActiveRecord::RecordInvalid` が発生します。

[code]

    class StudentsSubject
      belongs_to :student
    end
    
[/code]

以下のようにすればstudent_idは必須でなくなるので`ActiveRecord::InvalidForeignKey`
をraiseさせることができます。

[code]

    belongs_to :student, optional: true
    
[/code]


CC BY-SA 4.0
2022-08-18T15:33:29.450
90616
2022-08-19T01:58:28.217
2022-08-19T01:58:28.217
3060
54050
86129
answer