概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / ActiveRecord - tables naming in a self join
- 原文公開日: 2018/01/19
- 著者: Paweł Dąbrowsk
Rails tips: self JOIN時のテーブル名を工夫する(翻訳)
通常、テーブルの命名を気にすることはありません。テーブル名は明らかだからです。しかし、たまに命名で一瞬考えてしまうことがあります。ここではいわゆるself JOIN(自己結合)を念頭に置いています。次の例で考えてみましょう。User
モデルにmanager_id
カラムがあるとします。このカラムは同じテーブルを指しているので、User
モデルは管理職(manager)とユーザーの両方を扱います。
User
モデル
モデルは以下のようになっているとします。
class User < ActiveRecord::Base
belongs_to :manager, class_name: "Person", foreign_key: :manager_id
has_many :employees, class_name: "Person", foreign_key: :manager_id
end
問題
ここで、管理職と、管理者ごとの従業員数を表示したいとします。これは次のようなクエリでできます。
User.joins(:employees).group("users.name").count("employees_users.id")
お気づきのように、ここではemployees_users
という名前が使われています。ここではJOINを使っているため、同じテーブルをJOINする場合でもテーブルが2つになってしまいます。
パターン
このような場合に使えるパターンがあります。関連付け名の複数形とモデル名を組み合わせるだけでできます。
お知らせ: RSpec & TDDの電子書籍を無料でダウンロード
もっと稼ぎたい方や会社をさらに発展させたい方へ: テスティングのスキルの重要性にお気づきでしょうか?テストを正しく書き始めることが、唯一のファーストステップです。無料でダウンロードいただける私の書籍『RSpec & Test Driven Developmentの無料ebook』をどうぞお役立てください。