#【Rails】PG::AmbiguousColumn: ERROR: column reference "name" is ambiguous
アソシエーションが張られた同じカラム名を持つ2つのモデルでそのカラム名を使ったメソッドを定義したところ上記のエラーが出ました。その際の対応内容をまとめます。
目次
動作環境
OS : macOS 10.14.6
ruby : 2.6.5
Rails : 5.2.4.2
状況
カテゴリモデル
とユーザモデル
はそれぞれname
という同じ名前のカラム名を持ち,多対多のアソシエーションが張られている状況です。
ここでユーザモデル
とカテゴリモデル
で
それぞれにモデルのスコープメソッドを定義しています。
class Category < ApplicationRecord
has_many :category_users, dependent: :destroy
has_many :users, through: :category_users, source: :user
#検索画面で選択したキーワード名から該当のキーワードを取得するメソッド
scope :select_category, ->(category) { where('name = ?', category) }
end
class User < ApplicationRecord
has_many :category_users, dependent: :destroy
has_many :categories, through: :category_users, source: :category
#カテゴリモデルのスコープ`select_category'を呼び出している
scope :category_users, ->(category) { joins(:categories).merge(Category.select_category(category)) }
end
PG::AmbiguousColumn: ERROR: column reference "name" is ambiguous
というエラーが出ます.
解決策
上記のエラーはname
カラムが曖昧だというエラーです。
そこでカテゴリモデルのスコープメソッドにテーブル名を付けます。
class Category < ApplicationRecord
has_many :category_users, dependent: :destroy
has_many :users, through: :category_users, source: :user
# name -> categories.nameとすることでカテゴリテーブルのnameカラムと明示する
scope :select_category, ->(category) { where('categories.name = ?', category) }
end
原因
下記のSQLログの末尾を見るとWhere name = 'abcc..'
にテーブル名が付いていないことがわかる.
: SELECT "users".* FROM "users" INNER JOIN "category_users" ON "category_users"."user_id" = "users"."id" INNER JOIN "categories" ON "categories"."id" = "category_users"."category_id" WHERE name = 'abccccdd'
つまり,Userモデル
からCategoryモデル
のスコープメソッドを呼び出した際に,ActiveRecordではどちらのテーブルのname
か判別することができないためエラーが発生したと考える