Rails5からbelongs_toアソシエーションの挙動が変わった

Rails5から belogs_to アソシエーションの挙動が変わった。

親モデルに属している子モデルは親モデルの外部キーが存在しないとバリデーションエラーになるのがデフォルトの挙動となっている。
参照先レコードのidをnullで登録しようとした場合は以下のようなバリデーションエラーが出る。

1
ActiveRecord::RecordInvalid: Validation failed: Post  must exist

DHHの一声で belogs_to の挙動が変わる様が垣間見れるイシュー。

DHHの言い分としては「普通 belongs_to って、参照先テーブルのIDは必ずもってるだろ。ならデフォルト required: true でよくね?」という話。

この挙動をRails4と同じにしたい場合は optional: true を使う(required: false は廃止予定なので使わないほうがいい)。

1
2
3
4

class Post < ApplicationRecord
belongs_to :article , optional: true
end

belongs_to のオプションの詳細については以下のドキュメントで参照できる。