Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails: `strict_loading!`をしたPolymorphicなModelからassociationを辿ると`ArgumentError`が発生する

タイトル通り、かなりハマったので事象をメモしておく。

事象

タイトル通りですが、strict_loading!をしてeager_loadingを強制しているPolymorphic関連を持つモデルから、 関連を辿ると本来であればActiveRecord::StrictLoadingViolationErrorが発生すると思うのですが、 以下の通りArgumentErrorが発生します。

ArgumentError: Polymorphic associations do not support computing the class.
  activerecord-7.0.2.3/lib/active_record/reflection.rb:417:in `compute_class'
  activerecord-7.0.2.3/lib/active_record/reflection.rb:376:in `klass'
  activerecord-7.0.2.3/lib/active_record/core.rb:241:in `strict_loading_violation!'
  activerecord-7.0.2.3/lib/active_record/associations/association.rb:220:in `find_target'
  activerecord-7.0.2.3/lib/active_record/associations/singular_association.rb:44:in `find_target'
  activerecord-7.0.2.3/lib/active_record/associations/association.rb:173:in `load_target'
  activerecord-7.0.2.3/lib/active_record/associations/association.rb:67:in `reload'
  activerecord-7.0.2.3/lib/active_record/associations/singular_association.rb:11:in `reader'
  activerecord-7.0.2.3/lib/active_record/associations/builder/association.rb:104:in `target'
  active_record_gem.rb:46:in `test_strict_loading_to_Polymorphic_model'

再現コードはこちら

github.com

解決策

とりあえずstrict_loading!(false)して、strict_loadingを無効化してあげれば例外発生自体は防げるのですが、ArgumentErrorになるのは謎ですね。。。 ※ strict_loadingってPolymorphic associationに対応していない?

おわりに

strict_loadingとPolymorphic associationの掛け合わせなので、あんまりハマることも少ないかもですが。。。Rails難しい。。。 strict_loading使ってたけど、まだ本番利用してるところは少ないのかも?

2022/04/17追記

issueあげてみました

github.com

2022/05/07追記

対応版のPRがマージされて7.0 stableにバックポートされそうなので次回リリースで修正されそうです🙏✨

github.com

参考

madogiwa0124.hatenablog.com