管理员在场的用户验证

时间:2015-11-26 13:02:10

标签: ruby-on-rails

我试图为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

2 个答案:

答案 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

说明:

  1. company.users.where(admin: true).count == 1因为计数不会 初始化所有用户,节省时间和内存。
  2. admin_changed? && admin == false表示如果您将管理员更改为false,则您的管理员设置为true,因此您是唯一的管理员!所以哎呀,你不能改变你的管理状态!