【Rails】テーブル名にプレフィックスを付与・ネームスペース付きのモデルを作成
はじめに
ある2つのプロジェクトを1つのプロジェクトとして統合して管理したいため、Railsアプリの各ディレクトリ内を以下のようにプロジェクト毎に取り扱いということがありました。
models └ProjectA └User.rb └Admin.rb └... └ProjectB └User.rb └Admin.rb └...
そのためテーブル名にプレフィックスをつけて管理、モデルもそれに対応する必要があり、この記事を書いています。
ネームスペース付きのモデルを新規で作成してみる
新規でテーブル名にプレフィックスを付与・ネームスペース付きのモデルを作成する場合は以下のようにネームスペース名::
をつけてモデルを作成します。
rails g model Project::User email:string
ネームスペース付きでrails g modeをすると以下のファイルが作成されます。
①マイグレートファイル
class CreateProjectUsers < ActiveRecord::Migration[7.0] def change create_table :project_users do |t| t.string :email t.timestamps end end end
②self.table_name_prefix
をオーバーライドしてくれるmodule
module Project def self.table_name_prefix "project_" end end
③Projectのネームスペース付きUserモデル
class Project::User < ApplicationRecord end
通常rails g model
する時との違いとして以下があります。
- ① table名にプレフィックスが付与される(
project_users
) - ② self.table_name_prefixをオーバーライドするmoduleが作成される
Project::User
からfindやwhereをした際に、project_xxxx
のテーブルを参照するようになる
- ③ モデル名に
Project::
のようなネームスペースが付与される
既存のプロジェクトをネームスペースに分けたい時
既存のプロジェクトをネームスペースで分けたいけど、テーブル名は変えたくありませんでした。
その際は前述のapp/models/project.rb
にあたるself.table_name_prefix
をオーバーライドするファイルを作成せず、③のようにネームスペース(Project::
)をつけてあげるだけで問題ありませんでした。
Project::User.find
すると発行されるSQLで参照されるテーブル名はusers
のままです。
また、controller等でUser.find
みたいに呼び出している箇所はProject::User.find
のように呼び出すよう修正してみてください。