我试图为User
编写验证,以确保company.users.where(admin: true).size >= 1
如果公司中只有一名管理员,那么她就无法撤销她的管理员访问权限该公司没有任何管理员。
我认为我需要编写一个验证来检查用户是否正在将admin
更改为false,如果用户管理员的大小等于1而不是给出错误消息。
这是我到目前为止所做的,但我不确定如何使用正确的验证类型触发此操作。
def company_have_one_admin_present
errors.add(:admin, 'must have one admin') if 1 == company.users.where(admin: true).size
end
答案 0 :(得分:0)
尝试将此添加到您的模型中,我还没有对其进行测试,但我认为您可以执行以下操作:
validate :company_have_one_admin_present, on: :update
def company_have_one_admin_present
admins = company.users.where(admin: true)
if !admin? && admins.size == 1 && admins.find_by(id: id)
errors.add(:admin, "at least one admin required")
end
end
仅当用户不是新记录on: :update
并且他当前设置为不是管理员!admin?
时才会进行此验证,但在数据库中他实际上设置为管理员(并且是该公司唯一的一个)admins.size == 1 && admins.find_by(id: id)
答案 1 :(得分:0)
我建议这个解决方案
class User
validate :company_have_one_admin_present
def company_have_one_admin_present
if persisted? &&
(company.users.where(admin: true).count == 1) &&
(admin_changed? && admin == false)
errors.add(:admin, 'must have at least one admin')
end
end
end
说明:
company.users.where(admin: true).count == 1
因为计数不会
初始化所有用户,节省时间和内存。admin_changed? && admin == false
表示如果您将管理员更改为false,则您的管理员设置为true,因此您是唯一的管理员!所以哎呀,你不能改变你的管理状态!