Rails tips: self JOIN時のテーブル名を工夫する(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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』をどうぞお役立てください。

関連記事

Rails tips: モデルのクエリをカプセル化する2つの方法(翻訳)

Rails: ActiveRecord関連付けのpreload/eager-loadをテストする2つの方法(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の半分ほど、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れてそれぞれ一部を翻訳。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好き。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ