はじめに
Rails5.1.1で動かしていたプログラムを、Rails5.2.0で動かしたら、JoinDependency.new
でエラーが発生した。
いろいろ回り道して調べた結果、ここ3日くらいハマってしまったのでメモ。
発生したエラー
wrong number of arguments (given 3, expected 4)
原因
ActiveRecord 5.1.1と、ActiveRecord 5.2.0では、コンストラクタの引数の仕様が変わっている ため。 なん・・・だと・・・。
ActiveRecord 5.1.1
Class: ActiveRecord::Associations::JoinDependency — Documentation for activerecord (5.1.1)
initialize(base, associations, joins, eager_loading: true)
ActiveRecord 5.2.0
Class: ActiveRecord::Associations::JoinDependency — Documentation for activerecord (5.2.0)
initialize(base, table, associations, alias_tracker)
うおー。変わってるー!table
ってなんじゃい!
第2引数のtable
には、Userオブジェクトなどを入れると動く。
ActiveRecord 5.2.1
ちなみに、最新版の5.2.1も調べてみた。コンストラクタの引数が4つから3つになってる!!
Class: ActiveRecord::Associations::JoinDependency — Documentation for activerecord (5.2.1)
initialize(base, table, associations)
修正方法
ひとまずプロジェクトでは、ActiveRecord 5.2.0を使う。
JoinDependency.new
使用時に、第2引数を追加。
修正前
join_dependency = ::ActiveRecord::Associations::JoinDependency.new(klass, [], [])
修正後
join_dependency = ::ActiveRecord::Associations::JoinDependency.new(klass, self.base.base_klass, [], [])
おわりに
Railsだけでなく、ActiveRecordのソースもちゃんと読んだほうがいいなと思いました。 反省。