Rails 删除前验证关联计数

Rails validate association count before removing

我的模特是

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

现在,假设我有一个可以删除管理员的控制器。如果管理员是其公司的唯一管理员,我如何防止删除管理员(即产生错误)?

如果我理解得很好,我必须从内存对象中删除管理员,然后尝试 "save/destroy" 如果先验证公司 ?

我认为您根本不需要对 Company 模型进行自定义验证。您可以对您的关联使用 'length' 验证。

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

您可能还想看看在您的管理 class 中使用 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

这里有关于使用 before_destroy 的很好的描述: 这值得一看,因为实现会因您的 Rails 版本而异。