Rails 5.1からbelongs_to
を指定した時、自動的にrequired: true
オプションが追加されpresenseのバリデーションが走るようになったことを今知った(https://github.com/rails/rails/issues/34454 )のですが(同時にrequiredオプションは非推奨になったようです)。
そして、新たにoptional
というオプションが追加され、その名の通り、これをオンにすると、presenseのバリデーションを追加しないように指定できるというもの。
要は、
class Book < ActiveRecord::Base
belongs_to :author, optional: true
end
としておけば、Book.new author: nil
としても、検証はパスするようにできるということ。
これをRailsでなく、ActiveRecord単体で使おうとするとうまくいかなかった。調べてみたら、この機能はRailtieがRailsの初期化プロセスの中でオンにしているようで( https://github.com/rails/rails/blob/b2864a2069dfe9e3d483e16a74a9e6271759accc/railties/lib/rails/application/configuration.rb#L87 )、ActiveRecord単体で有効にするには事前にActiveRecordに設定する必要がある。
ActiveRecord::Base.belongs_to_required_by_default= true
とすれば、うまく行った。
プロジェクトでActiveRecordを単体で使うときは、設定をちゃんとしないと引っかかるところが他にもありそうだなー。