技術部

プログラミングのことが中心

Rails5でのモデルのファイルの整理

1対1リレーション

どうしてもカラム数が増えてくるとテーブルを分たりすることになる。また、頻繁に使用しない情報などもテーブル分けて保存したりする。

そうするとどうしてもmodel数が増えたりして管理するのが難しくなる。 そこで今回配下のようにまとめた。

userモデルとuser_profileモデルとする。 UserとUserProfile の関係は1対1の関係

migrateファイル

xxxx_create_user.rbは普通にいつも通りカラム等を記述する

xxxx_create_user_profile.rb

class CreateWorkerProfiles < ActiveRecord::Migration[5.0]
  def change
    create_table :worker_profiles, id: false do |t|
      t.integer :id, null: false
    end
    add_index :worker_profiles, :id, unique: true
  end
end

migrateファイルは普段通りにprimary_keyを設定するようにする。

model/usersディレクトリ作成

model配下にuser.rbとuser_profile.rbのふたつのファイルを以下のように配置する

model/users/profile.rb
model/user.rb

に分ける。

profile.rbの中身

module Users
  class Profile < ApplicationRecord
    self.table_name = 'user_profiles'
    self.primary_key = :id
    belongs_to :user, foreign_key: 'id'

    before_create { self.id = self.user.id }
  end
end

profile.rbの中身は上記ようにする。 ここでのミソは以下。

self.table_name = 'user_profiles'

というコードが必要となってくる。 あとのコードは1対1リレーションで主キーをuserテーブルの外部キーにするためのコード

Userモデルのリレーション

class User < ActiveRecord::Base
  has_one :profile, dependent: :destroy, foreign_key: 'id', class_name: 'Users::Profile'
end

ここで重要なのが、class_name。これを指定する必要がある。

その他テストファイル等

rspecやfactory_girlなども上記のよに

models/users/profile.spec

のようにしてあげる。

ファイルの中身は

RSpec.describe Users::Profile, type: :model do

と修正する。

以上で1対1のリレーションとファイルの整理。

これの何が利点なのか、プロジェクト膨大になってきて、UserだけでなくAdminのProfileが必要だとかなって来た時に うまく整理できる。