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上使用
    ,不再需要
    持久化?
    。我更新了答案。