Ruby on rails 管理员状态的用户验证
我正试图为Ruby on rails 管理员状态的用户验证,ruby-on-rails,Ruby On Rails,我正试图为用户编写一个验证,以确保公司.users.where(admin:true).size>=1这样,如果公司中只有一个管理员,她就无法撤销她的管理员访问权限,公司也就没有任何管理员了 我想我需要编写一个验证,检查用户是否正在将admin更改为false,以及用户管理员的大小是否等于1,然后给出错误消息 这是我到目前为止所拥有的,但我不确定如何用正确的验证类型触发它 def company_have_one_admin_present errors.add(:admin, 'm
用户
编写一个验证,以确保公司.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
尝试将此添加到您的模型中,我尚未对其进行测试,但我认为您可以这样做:
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
只有当用户不是::update上的新记录且当前设置为非管理员时,才会进行此验证!管理员?,但在数据库中,他实际上被设置为管理员(并且是公司唯一的管理员)
admins.size==1&&admins.find_by(id:id)
我建议使用此解决方案
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
,因为count不会
初始化所有用户,节省时间和内存admin\u已更改?&&admin==false
意味着如果您将admin更改为false,您的admin将设置为true,因此您是唯一的管理员!哦,不,你不能改变你的管理员身份李>
新公司会怎么样?始终创建的第一个用户将是管理员?有没有没有没有公司的用户?我喜欢你的解决方案,我不知道
\u更改了什么?
,但我认为你需要明确检查他是否是公司的前任管理员,因为可能他目前也在更改公司,而新公司只有一个(不同的)管理员。很好!但是,admins.find\u by(id:id)
不起作用,因为self还没有保存,您正在查询它以前的公司。不因此,我们还应该检查公司是否发生了变化,我想……不,如果公司也发生了变化,那么当您执行管理员。find_by(id:id)
时,您正在查询新公司,它应该返回nil。我在验证中添加了更新,这使它正常工作,通过在::update上使用,不再需要持久化?
。我更新了答案。