5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ruby on Rails: 中間テーブルの使い方を初心者が説明

Posted at

1. 中間テーブルとは?

中間テーブルは、多対多の関係を持つ2つのモデル間に配置されるテーブルのことを指します。これは、あるモデル別のモデルの間に多対多の関係が存在する場合に使用されます。

例として、UserモデルとBookモデルを考えます。

  • 一人のユーザーが複数の本を所有し、
  • 一冊の本が複数のユーザーに所有されている場合、

この関係性を効率よく管理するために中間テーブルが必要となります。

2. 中間テーブルの作成方法

rails g model UserBook user:references book:references

このコマンドはUserBookという中間テーブルを生成します。
user:referencesとbook:referencesは、それぞれのモデルへの外部キーを生成するためのものです。
これにより、UserBookテーブルはUserとBookの間の関係を持つことができます。

class UserBook < ApplicationRecord
  belongs_to :user
  belongs_to :book
end

このUserBookモデルでは、belongs_toを使用して、関連するモデル(UserとBook)との関係を定義しています。

3. モデル間の関連付けの設定

class User < ApplicationRecord
  has_many :user_books
  has_many :books, through: :user_books
end

class Book < ApplicationRecord
  has_many :user_books
  has_many :users, through: :user_books
end

このコードでは、UserモデルとBookモデルが、中間テーブルであるUserBookを介して関連付けられていることを示しています。has_many :throughは、中間テーブルを経由した関連付けを定義するためのものです。

4. 中間テーブルの有効な使い方

中間テーブルを使用すると、以下のような操作が簡単になります。

あるユーザーが所有している本の一覧を取得する場合:

user = User.find(1)
user.books

このコードでは、IDが1のユーザーが所有している本の一覧を取得しています。

ある本を所有しているユーザーの一覧を取得する場合:

book = Book.find(1)
book.users

このコードでは、IDが1の本を所有しているユーザーの一覧を取得しています。

特定のユーザーが特定の本を所有しているかどうかを確認する場合:

user.books.exists?(book.id)

このコードは、指定したユーザーが特定の本を所有しているかどうかを確認するためのものです。

まとめ

中間テーブルは、多対多の関係を持つ2つのモデル間に配置されるテーブルです
rails g modelコマンドを使用して、中間テーブルを作成することができ、
belongs_toを使用して、中間テーブルのモデルで関連するモデルとの関係を定義でき、
has_many :throughを使用して、中間テーブルを経由した関連付けを行います。

中間テーブルを使用することで、

  • 特定のユーザーが所有している本の一覧
  • 特定の本を所有しているユーザーの一覧などの操作

Ruby on Railsの中間テーブルは、多対多の関係を効率的に管理できます。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?