注記
この記事の投稿者はRuby on Rails初学者であり、自身の学習の備忘録目的で記事投稿を行なっております。
情報の正確さには最大限注意をしておりますが、もし誤り等がございましたらお知らせいただけますと幸いです。
ご覧いただきありがとうございます!
Ito と申します!
Ruby on Rails初学者です。
タイトルの通り
「RailsでのO/Rマッピング時、中間テーブルがどのように変換されているのか?」
個人的にわかりにくいと感じたので、端的にまとめてみました。
場面設定
タグ投稿機能を持った掲示板アプリを想定しています。
Post
モデルがTags
モデルと関連付けされています。
posts
テーブルとtags
テーブルはpost_tags
テーブルを介して多対多の関係です。
モデル
class Post < ApplicationRecord
has_many :post_tags
has_many :tags, through: :post_tags
#...(以下略)...
class Tag < ApplicationRecord
has_many :post_tags
has_many :posts, through: :post_tags
end
class PostTag < ApplicationRecord
belongs_to :post
belongs_to :tag
end
知りたかったこと
.rb
ファイルに 「指定したtag
のid
を持つpost
を抽出するロジック」 を書いたのですが、中間テーブルpost_tags
を書かずともデータを取得できてしまいました。
じゃあ、SQLクエリに変換された際に中間テーブルpost_tags
がどう機能しているのか?という点がよくわからなかったので調べてみました。
調べたコード
.rb
ファイル
@post = Post.joins(:tags).where(tags: { id: tag_id })
↓
SQLクエリに変換(log
にて確認)
SELECT posts.*
FROM posts
INNER JOIN post_tags ON post_tags.post_id = posts.id
INNER JOIN tags ON tags.id = post_tags.tag_id
WHERE tags.id = '指定されたタグID'
わかったこと
posts
テーブルとtags
テーブルを結合する命令文を書くだけで、
SQLクエリに変換される際には post_tags
を介してテーブル結合が行われていることがわかりました。
所管
中間テーブルを使った関連付けの際には、どういうSQLクエリが発行されているかが表面上わかりにくいので、都度立ち止まって確認することで、理解を深めていく必要があると感じました。
以上です!
ご覧いただきありがとうございました!学習頑張ります!