紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【ActiveRecord5.2.0】JoinDependencyのコンストラクタの引数の仕様がいろいろ変わっている事に気づかず、3日くらいハマった話。#Rails #ActiveRecord

f:id:yokoyantech:20181005130407p:plain

はじめに

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のソースもちゃんと読んだほうがいいなと思いました。 反省。