我有一个如下的用户和公司模型。公司模型有一些验证。
user.rb
after_create :create_tables!
def create_tables!
companies.create!(handle: "random_handle")
end
company.rb
before_destroy :check_for_presence_of_a_company!
def check_for_presence_of_a_company!
if user.companies.count <= 1
errors.add(:base, 'You cannot delete all of your companies.')
throw(:abort)
end
end
当用户首次创建帐户时,我会在用户模型中使用 after_create 为他创建公司,而在删除公司之前,他应该至少拥有一家公司。
但是问题是,当用户尝试删除其帐户时,上述公司验证会引发错误。
用户删除帐户时,应忽略上述验证 company.rb 。我怎样才能做到这一点?谢谢。
编辑
在 user.rb 中,我已更新
has_many :companies,dependent: :destroy
到
has_many :companies,dependent: :delete_all
但是 company.rb
has_many :categories, dependent: :destroy
并显示违反了外键约束错误。将其从destroy更新为delete_all也不起作用。
答案 0 :(得分:1)
您可以添加dependent: :destroy
回调并调用after_destroy
或delete
(不运行验证)来代替使用delete_all
。
# user.rb
after_destroy :delete_companies
def delete_companies
companies.delete_all
end
答案 1 :(得分:1)
我假设您有这个(尽管您没有显示):
class User
has_many :companies, dependent: :destroy
end
如果是这样,您可以将:destroy
更改为:delete_all
:
has_many :companies, dependent: :delete_all
每https://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many:
:delete_all
导致所有关联的对象直接从数据库中删除(因此将不执行回调)。
(n.b。由于不会运行Company
上的回调,因此,如果您需要删除其他关联,则必须分别处理它们。)