5
2

【Rails】O/Rマッピング時の中間テーブル、わかりにくかったので簡単に調べた。

Posted at

注記
この記事の投稿者はRuby on Rails初学者であり、自身の学習の備忘録目的で記事投稿を行なっております。
情報の正確さには最大限注意をしておりますが、もし誤り等がございましたらお知らせいただけますと幸いです。

ご覧いただきありがとうございます!
Ito と申します!
Ruby on Rails初学者です。
  
タイトルの通り
「RailsでのO/Rマッピング時、中間テーブルがどのように変換されているのか?」
個人的にわかりにくいと感じたので、端的にまとめてみました。

場面設定

タグ投稿機能を持った掲示板アプリを想定しています。

PostモデルがTagsモデルと関連付けされています。
postsテーブルとtagsテーブルはpost_tagsテーブルを介して多対多の関係です。

モデル

app/models/post.rb
class Post < ApplicationRecord

  has_many :post_tags
  has_many :tags, through: :post_tags
  #...(以下略)...
app/models/tag.rb
class Tag < ApplicationRecord
  has_many :post_tags
  has_many :posts, through: :post_tags
end
app/models/post_tag.rb
class PostTag < ApplicationRecord
  belongs_to :post
  belongs_to :tag
end

知りたかったこと

.rbファイルに 「指定したtagidを持つ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クエリが発行されているかが表面上わかりにくいので、都度立ち止まって確認することで、理解を深めていく必要があると感じました。

以上です!
ご覧いただきありがとうございました!学習頑張ります!:muscle:

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2