Ruby on rails Rails在删除之前验证关联计数

Ruby on rails Rails在删除之前验证关联计数,ruby-on-rails,validation,activemodel,ruby-on-rails-5,Ruby On Rails,Validation,Activemodel,Ruby On Rails 5,我的模特是 class Company has_many :admins validate :has_one_admin_validation private def has_one_admin_validation errors.add(:admins, :not_enough) if admins.size < 1 end end class Admin belong_to :company end class公司 你有很多管理员吗 验证:有

我的模特是

class Company
  has_many :admins

  validate :has_one_admin_validation

  private

  def has_one_admin_validation
    errors.add(:admins, :not_enough) if admins.size < 1
  end

end

class Admin
  belong_to :company
end
class公司
你有很多管理员吗
验证:有一个\u管理\u验证
私有的
def有一个管理验证
错误。如果admins.size<1,则添加(:admins,:不够)
结束
结束
班级管理员
属于:公司
结束
现在,假设我有一个可以删除管理员的控制器。如果管理员是其公司的唯一管理员,如何防止删除该管理员(即生成错误)


如果我理解得很好,我必须从内存对象中删除admin,并尝试通过首先验证公司来“保存/销毁”?

我认为您根本不需要对公司模型进行自定义验证。您可以对关联使用“长度”验证

validates :admins, length: { minimum: 1 }
如果这不起作用,您还应该能够检查“marked_for_destruction?”属性。您还应该能够通过“presence:true”验证来验证互惠关系

    class Company
        has_many :admins

        validate :has_one_admin_validation

        private

        def has_one_admin_validation
          errors.add :admins, "You need at least one admin" if admins.reject(&:marked_for_destruction?).empty?
        end

    end

    class Admin
        belongs_to :company, presence: true
    end
您可能还想看看在Admin类中使用before_destroy回调

before_destroy :has_company_with_no_other_admins
        ...

        private

        def has_company_with_no_other_admins
          return false if company.admins.length < 2
          true
        end
销毁前:公司是否有其他管理员
...
私有的
def有公司,没有其他管理员
如果company.admins.length<2,则返回false
真的
结束
这里有一个关于销毁前使用的非常好的描述:
这一点值得一看,因为实现会因Rails版本而异。

hmmm此验证会在Admin delete上运行吗?请注意,验证存在于Category类中,或者可能应该放在Admin类中?嗨!我不是OP,但我有一个项目,我可以使用这样的东西。假设我有一个与has_one关联的模型,这是否有助于我对该模型强制执行1个关联的限制?干杯,谢谢@AlfredGallegos
仅拥有一个就足够了,不需要验证,事实上添加多个将导致Ruby运行时异常(可能是NoMethodError)。问题是,在该项目中,尽管我的模型拥有一个/属于一个,但我还是能够建立多个关系。我认为这对我来说是个傻瓜,所以不用担心:^@niceman-我想你可能是对的,我对这个问题有点误解,没有向Admin添加相互验证。我已经相应地编辑了我的答案,将'presence:true'修饰符添加到Admin类中。注意,存在hmm,但可能此验证属于Admin类,但不确定