はじめに
Railsでeager_loadしようとしたときに、下記のようなエラーが出て解消に時間がかかったのでまとめました。
Mysql2::Error: Column 'updated_at' in order clause is ambiguous
やりたいこと
user の updated_at を指定した期間のものだけ抽出するために、テーブルの結合をしたい。
なぜeager_loadできないのか
これを実行すると、
User.where("updated_at >= '2020/01/01' and updated_at <= '2020/01/31'").eager_load(:post)
MySQLのエラーが出る。
Mysql2::Error: Column 'updated_at' in order clause is ambiguous
なぜか。
updated_at は User にも Post にも存在しているため、どちらの updated_at なのか判別がつかない。
そこで、incidents.updated_at とすることで、User の updated_at なのか Post の updated_at なのかを明確化する。
下のように書き換えることで、エラーを解消することができました。
# incidents.updated_at とすることで、user
User.where("incidents.updated_at >= '2020/01/01' and incidents.updated_at <= '2020/01/31'").eager_load(:post)
まとめ
updated_at は、どのテーブルでも持っている値となるので、こういう値でjoinするときは気をつけるようにします。
裏話としては、railsでデバックをしていていたのですが、eager_loadを実行したらSQL文しか表示されずエラーが表示されていませんでした。
.to_sで文字列化することで、上記のMysql2::Errorが出てなんとかデバックすることができました。
エラーが隠れてる??自分の確認方法が悪かっただけかもしれませんが、、
時間はかかりましたが、解決できてよかったです。
参考
- includes,joins,eager_load,preloadの違いを噛み砕いて説明する
- Mysql2::Error: Column 'created_at' in order clause is ambiguousの対策