class User << ActiveRecord::Base
# ココ
has_many :user_group, primary_key: :group_id, foreign_key: :gid
end
モデルに結合先テーブルとの関連を記述する
この定義で、primary_keyで自分のカラム、foreign_keyで相手テーブルのカラムを指定する
User.joins(:user_group)
# "SELECT `users`.* FROM `users`
# INNER JOIN `user_groups` ON `user_groups`.`gid` = `users`.`group_id`"
joins()で関連名を指定する
class User << ActiveRecord::Base
# ココ
has_many :user_group, primary_key: [ :group_id, :affilitation_nm ], foreign_key: [ :gid, :group_nm]
# "SELECT `users`.* FROM `users` INNER JOIN `user_groups` ON `user_groups`.`gid` = `users`.`group_id` AND `user_groups`.`group_nm` = `users`.`affilitation_nm `"
end
カラム名を配列で指定すると複数カラムでjoin句が生成される
User.left_joins(:user_group)
# "SELECT `users`.* FROM `users` LEFT OUTER JOIN `user_groups` ON `user_groups`.`gid` = `users`.`group_id`"
left_joins()を使う
どれを使っても生成されるクエリは同じだった
ただしbelongs_toは、子レコードに対して親レコードが必須となり、
子レコードしかない状態で使うとエラーとなる
("バリデーションに失敗しました: xxx を入力してください"というエラー)
テーブル名を省略した場合、関連名を複数形にしたテーブル名が使用される
関連名とは別にテーブル名を指定したい場合はclass_nameキーを記述する
class User << ActiveRecord::Base
# ココ
has_many :group, class_name: "UserGroup", primary_key: :group_id, foreign_key: :gid
end
class_nameに指定するのはテーブル名ではなくクラス名
# 定義名で呼び出し
User.joins(:group)
# SELECT `users`.* FROM `users`
# INNER JOIN `user_groups` ON `user_groups`.`gid` = `users`.`group_id`"