1. はじめに
いつも全ての値を取得するにはモデル名.allすればいいから簡単だと思っていたら関連付の値を取得するのに意外と苦労したのでまとめます。
2. 実装
通常
controller
def index
@インスタンス = モデル名.all
end
これで全ての値を取得することが可能でしたが。関連付けを行なっている場合はそうは行きません。
例としてUserモデル
とPostモデル
を想定します。
User
class User < ApplicationRecord
has_many :posts
end
Post
class Post < ApplicationRecord
belongs_to :user
end
UserとPostの関連づいた情報を取得していきます。
情報を取得するにはjoins
を使用します
関連付いた情報を取得
def index
@users = User.joins(:posts)
end
・joins
を使用することでUserとPostが結びついた情報を持ってきてくれる。
・結合先(Postモデル)の情報がいらない場合はこれでOK
UserとPost両方の情報を取得
@users = User.joins(:posts).select("users.*", "posts.*")
・select
を使用することでカラム(postsカラム)も取得できる。
joins
ではテーブルを結合して表示してくれる便利なものです。
結合には2種類あります。
1, 内部結合
2, 外部結合
1, 内部結合
UserとPostのidが一致するものだけを結合して表示させます。
外部結合
UserとPostのidが一致しない値も表示します。
今回は内部結合だけ実装しました。
3. おわりに
RailsのmodelはSQLを意識することなく操作できるとどこかで見たけど、SQLの知識があった方が理解が早いし、何より面白いと感じました。