はじめに
STIであるモデルが絡んだ場合など、たまにタイトルのようにカラム名と異なるアソシエーションを設定したくなる場合がある。その方法について記録する。
結論
例えば、ユーザ(User)一人一人に対し、複数の著書(Book)が属している
ような場合に、その著書(Book)から、ユーザ(User)を取得する関連を「author(著者)」
としたい場合には、
class User < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author, class_name: "User", foreign_key: "user_id"
end
と、foreign_key: "user_id"
でカラム名を指定する。
詳細
foreign_key
でカラム名を指定しない場合、デフォルトではアソシエーション名に_id
が追加されたカラムが参照される。
今回の例だと、Bookテーブルのauthor_id
カラムをRailsは参照するが、実際にあるのは、user_id
カラムなのでエラーとなる。
foreign_key
オプションを使い、BookテーブルでUserテーブルの外部キーとなっているuser_id
を明示的に指定することで解決する。
おわりに
アソシエーションはオプションが色々あり、都度詳細は調べているような形になってしまっているので、調べずに済むよう理解を深めていきたい。