[Ruby on Rails]sorceryによる認証 – (6)部署別のアクセス制限 #2 モデル

2015.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回に引き続き、部署別のアクセス制限をsorceryで行うサンプルについてです。今回はモデルのソースコードを取り上げます。尚、作成したサンプルは以下のGithubに置いてあります。全ソースを見たい方は参考にしてください。
sorcery_api_sample

ソースコード

前回書いたように、以前の記事でのサンプルに部署のマスタとなるdepartmentsテーブル、ユーザの所属部署を管理するuser_departmentsテーブルを追加しました。よって、それぞれのテーブルに対応するDepartmentモデル、UserDepartmentモデルを新規に作成しました。

Departmentモデル

class Department < ActiveRecord::Base
  has_many :user_departments

  ADMINISTRATOR = 10
  PURCHASE = 20
end

UserDepartmentモデルと1:Nの関連になることを定義してます。また管理部・購買部のIDも定義しています。

UserDepartmentモデル

class UserDepartment < ActiveRecord::Base
  belongs_to :user
  belongs_to :department
end

Userモデル、Departmentモデルとの関連を定義しており、それぞれのモデルとuser_id、department_idで紐づくようになります。

Userモデル

Userモデルは以前からあり、今回修正した箇所のみ載せておきます。

class User < ActiveRecord::Base
(中略)
  has_one :user_department, dependent: :destroy
(中略)
  def save_relation(department_params)
    if Department.exists?(department_params[:department_id]) && self.save
      user_department =  UserDepartment.new(user_id: self.id, department_id: department_params[:department_id])
      return user_department.save
    else
      false
    end
  end

  def update_relation(user_params, department_params)
    if Department.exists?(department_params[:department_id]) && self.update(user_params)
      return self.user_department.update(department_params)
    else
      false
    end
  end
(中略)

has_one〜でUserDepartmentモデルとの関連を定義しており、これによりUserモデル.idとUserDepartmentモデル.user_idが紐づくことになります。
save_relation()メソッドはユーザ情報を新規に保存するためのメソッドです。引数で渡された部署IDが存在することを確認し、Userテーブル、UserDepartmentテーブルにデータを作成します。
update_relation()メソッドはユーザ情報を更新するためのメソッドです。save_ralation()メソッドの更新用と考えてもらえればいいかと思います。

まとめ

モデルについては以上となります。ActiveRecordの関連の機能を使い、既存テーブルを変更することなくユーザの所属部署を追加できました。