コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsではなぜ多対多を表現する中間テーブルは「モデル名が結合されたもの」が使わていたのか

昔から users_teams のようにテーブルに名付けることが多かったが、これは推奨される方法なのかどうかがわからないので整理する。

とりあげる事例

  • 本は著者を持つ
  • 著者はいくつもの本を持つ可能性があるので、N:Nの関係になる

というようなモデルを作るとに、以下のようなER図になるパターンの場合の間を取り持つテーブル名が今回のテーマ。

authorsが著者、booksが本、その場合にN:Nを表現する中間テーブルとしてauthors_booksというテーブルを置く。

この場合に「ふたつのテーブル名を使ってauthors_booksという名前を中間テーブル名にするのがよい」という意見があるが、その意見はどこから来て、現在ではどう捉えるべきなのかを整理する。

なぜこの方法が推奨されていたか

この命名has_and_belongs_to_many を利用するときの考え方に則したものとなっている。たとえば、先程のケースの場合は以下のようなモデルを定義する。

class Author < ApplicationRecord
  has_and_belongs_to_many :books
end

class Book < ApplicationRecord
  has_and_belongs_to_many :authors
end

このようにすることで、AuthorとBookのN:Nの関係を表現できる。

この場合、AuthorBookを関連付けさせるための関係を中間テーブルを使って表現する必要があるのだが、「このテーブルが中間テーブルとして利用します」ということを宣言していない。そのため、テーブル名の命名規則で表現する必要があり、authors_books という命名をする必要がある。

この流れから「中間テーブルには2つのモデル名をスネークケースでつなげる」というような名前になるケースが多かった。

現在ではどうなのか

現在ではRailsガイドにもあるように、has_and_belongs_to_many の利用は推奨はされていない。。また、has_many :through も存在するので、命名もルールに縛られて定義する必要がない。

そのため2025年時点では普通に中間テーブル名のネーミングを考えるアプローチをとり、意識をしないとしたとしてもふさわしい名前を考えてあげるほうがよいと思われる。

参考リンク