railsでmany to many を使用した多対多モデルを作成する。

rails

本記事では、railsでmany to many(多対多)のmodel、migrationを作成する方法を説明します。

以前の記事で、1対多のリレーションのやり方をわかりやすく説明した記事があるので、実装方法を知りたい方は参考にしてください

railsにおける多対多の作成方法

例として、図書管理システムを例に考える。図書館(Library)と本(book)のmodelがあるとき、図書館Aには複数の本があり、とある本(例えばデルトラクエストとか頭に浮かべてください)は複数の図書館に置かれていますよね。

よって図書館と本との間には多対多の関係性があるといえ、今回はこれを例として進めていきます。

クイックで多対多モデルを作成する方法

内容はいいから作成するために必要なコマンドだけ教えてという人はこちらを見てください。

モデルを作成する

libraryモデルを作成する

rails g model library name:text address:text ....
// 必要なカラムを設定するだけ

bookモデルを作成する

rails g model book name:text ....
// こちらも同様必要なカラムを設定するだけ

中間テーブルを作成する

rails g model library_book library:references book:references
// 中間テーブルの命名はモデル1_モデル2(library_book)が望ましい。
// 関連テーブル:referencesで多対多としたいmodelを紐づける

テーブルを作成(マイグレート)する

rails db:create
rails db:migrate

models/library.rbを修正する

class Library < ApplicationRecord
  has_many :books, through: :library_books #複数形にする必要があるため注意
  has_many :library_books #こちらも同様に複数形に
end

models/book.rbを修正する

class Book < ApplicationRecord
  has_many :libraries, through: :library_books #複数形にする必要があるため注意
  has_many :library_books #こちらも同様に複数形に
end

models/library_booksを修正する(model生成時に記載されているかも)

class LibraryBook < ApplicationRecord
  belongs_to :library
  belongs_to :book. #belongs_toの場合は単数形
end

以上でmany_to_manyによる多対多モデルの設定はできました!

many_to_manyフィールドモデルのデータを登録する

多対多のデータを登録する一つの手段として下記があります。

下記の例は、「東部図書館」に芥川龍之介の全ての著書を登録する手順です。

@library = Library.find(name: 東部図書館) # 東部図書館のlibraryインスタンスを取り出す。
@books = Books.find(author: "芥川龍之介") #芥川龍之介の著書を全て取り出す。
@library.books << @books #東部図書館に芥川龍之介の著書を全て登録する。

ポイントとしては3行目の処理。インスタンス名.リレーションモデル << リレーションモデルのインスタンスとすることで、リレーションを作成することができます。

上記の形を応用することでviewファイルから持ってきたインスタンスを多対多として登録できるようになります。

まとめ

まとめです。

  • 多対多でリレーションしたいmodelを作成する。
  • 中間テーブルをrails g model 多モデル①:references 多モデル②:referencesで作成する。
  • 多モデルのmodelにhas_many :関連づけたい多modelを記載する。

多対多のモデルは使用する頻度は少ないため忘れがちです。この記事で振り返って頂けたら嬉しいです。

コメント

タイトルとURLをコピーしました