[Rails] joinの方法

qlog公式からのメッセージ:ログインをしていなくてもいいねを押すことができます!

カラム名を明示的に指定してjoinしたい場合

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()を使う

has_one、has_many、belongs_toの違いによるクエリの違い

関連

どれを使っても生成されるクエリは同じだった
ただし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`"    

vranometria