【问题标题】:Rails validate association count before removingRails 在删除之前验证关联计数
【发布时间】:2016-10-18 11:53:15
【问题描述】:

我的模型是

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

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

如果我理解得很好,我必须从内存对象中删除管理员,如果先验证公司,则尝试“保存/销毁”?

【问题讨论】:

标签: ruby-on-rails validation activemodel ruby-on-rails-5


【解决方案1】:

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

validates :admins, length: { minimum: 1 }

如果这不起作用,您还应该能够检查“marked_for_destruction?”财产。您还应该能够通过“存在:真实”验证来验证互惠关系。

    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

您可能还想查看在管理类中使用 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 的描述:https://stackoverflow.com/a/123190/6441528 这值得一看,因为实现会因您的 Rails 版本而异。

【讨论】:

  • hmmm 这个验证会在 Admin delete 上运行吗?请注意,验证存在于 Category 类中,或者它应该放在 Admin 类中?
  • 嗨!我不是 OP,但我有一个项目可以使用这样的东西。假设我有一个带有 has_one 关联模型的模型,这会帮助我为该模型强制执行 1 个关联的限制吗?干杯,谢谢!
  • @AlfredoGallegos has_one 一个就够了,不需要验证,实际上加1个以上会导致Ruby运行时异常(可能是NoMethodError)
  • 问题是,在那个项目中,即使我的模型有 has_one/belongs_to,我也能够以某种方式建立不止一种关系。我认为这是我这边的一个傻瓜,所以不用担心:^)
  • @niceman - 我认为您可能是正确的,我对这个问题有些误解并且没有向管理员添加互惠验证。我已经相应地编辑了我的答案,将 'presence:true' 修饰符添加到 Admin 类。
猜你喜欢
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多