Rails

【Rails】Mysql2::Error: Column ‘カラム名’ in where clause is ambiguousの解消方法

Rails

 

今回は「Mysql2::Error: Column ‘カラム名’ in where clause is ambiguous」の解消方法について解説したいと思います。テーブル結合をした際に起こりうるエラーなので、joinやeager_loadを使用した際は注意して実装しましょう。

エラー原因

2021/01/01から2021/03/01の間に作成されたユーザーを検索したく、以下のようなコードを書いたと仮定します。

User.where("created_at >= '2021/01/01' and created_at <= '2021/03/01'").eager_load(:profile)

 

しかしこれを実行しようとすると、Mysql2エラーが吐かれてしまいます。

Mysql2::Error: Column ‘created_at’ in where clause is ambiguous
直訳すると、where句の「created_at」カラムが曖昧という意味になります。

 

この原因としては、created_atカラムがusersテーブルとprofilesテーブルの両方に含まれており、whereで検索したいのはuser、profileどっち?となっているためです。

このようにeager_loadやjoinを用いてテーブル結合を行い、加えてカラム指定をする場合はそのテーブル先も指定しなければならない点に注意しましょう。

テーブル結合の参考サイト: Rails における内部結合、外部結合まとめ

解消方法

先程のコードに戻ります。

テーブル結合時にカラムを指定する場合は、そのテーブル先も指定しなければならないという点に意識すれば、先程のコードはこのように書くことができます。

User.where("users.created_at >= '2021/01/01' and users.created_at <= '2021/03/01'").eager_load(:profile)

 

これで「Mysql2::Error: Column ‘created_at’ in where clause is ambiguous」のようなエラーを解消することができます。

まとめ

  • 「Mysql2::Error: Column ‘カラム名’ in where clause is ambiguous」は複数テーブルに渡って同じカラムが存在していた場合に発生する
  • テーブル結合を行い、加えてカラム指定をする場合はそのテーブル先も指定しなければならない

参考

Rails における内部結合、外部結合まとめ

 

 

今回は「Mysql2::Error: Column ‘カラム名’ in where clause is ambiguous」の解消方法について解説しました。複数テーブルを結合した際は注意しながら実装していただけたらと思います。