この記事は公開されてから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の関連の機能を使い、既存テーブルを変更することなくユーザの所属部署を追加できました。