開発環境
ruby 2.6.5
Ruby on Rails 5.2.5
前提
ユーザーの認証機能をつけているアプリ
ユーザーに boolean 型で admin というカラムをつけ、admin が true のユーザーを管理者としている
本題
管理権限を持ったユーザーがが0人にならないようにする
バリデーションの機能実装
class User < ApplicationRecord
before_destroy :admin_exist_check
before_update :admin_update_exist
has_many :tasks, dependent: :destroy
# 中略
def admin_exist_check
if User.where(admin: true).count <= 1 && self.admin == true (←ここ)
throw(:abort)
end
end
def admin_update_exist
if User.where(admin: true).count == 1 && self.admin == false
throw(:abort)
end
end
end
上記みたいなコードを書く。
なにかを参考にしながら書いたコードなんだけど
このコードをモデルに書くと admin というカラムが true のユーザーが0人にならないようになる
ただ self という部分に違和感
自分で書いといてあれだけど self ってなんだ。。
binding.irb
def admin_exist_check
if User.where(admin: true).count <= 1 && self.admin == true (←ここ)
throw(:abort)
end
end
上のように動きを止めて、コンソール上で
self.admin
と打つと true
が返ってくる
さらにコンソール上で
self
と打つと
self
=> #<User id: 31, name: "adm", email: "xxx", password_digest: "$2a$12$mDmd3aFZR9D7korRsx/qvedQmflQo3QSz2h3i0BWebH...", created_at: "2021-06-07 13:44:56", updated_at: "2021-06-07 13:44:56", admin: true>
こんな風に値を保有していることがわかる。
つまりコールバックが発生した瞬間に呼び出されるメソッド内での self には
そのコールバックで変化する予定のリソースが入ってくる
ってことかな?笑。わかりません笑