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 版本而异。
我的模特是
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 版本而异。