跳过依赖项的验证::destroy

时间:2018-11-25 17:43:05

标签: ruby-on-rails ruby activerecord

我有一个如下的用户和公司模型。公司模型有一些验证。

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也不起作用。

2 个答案:

答案 0 :(得分:1)

您可以添加dependent: :destroy回调并调用after_destroydelete(不运行验证)来代替使​​用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上的回调,因此,如果您需要删除其他关联,则必须分别处理它们。)