Есть два способа сделать это: has_many: users,: related =>: delete_all или с дополнительным настраиваемым обратным вызовом в Аккаунтах. Метод: delete_all более прост, но не рекомендуется, потому что это означает, что ни один из ваших других обратных вызовов не произойдет в пользовательской записи.
Правильным решением является пользовательский обратный вызов before_destroy в учетной записи, работающий в тандеме с обратным вызовом пользователя.
class Account < ActiveRecord::Base
has_many :users
before_destroy :destroy_users
protected
def destroy_users
users.each do |user|
u.account_id = nil
u.destroy
end
end
end
class User < ActiveRecord::Base
belongs_to :account
before_destroy :protect_master_user
protected
def protect_master_user
unless account_id.nil? ||! master ||
User.find_all_by_account_id_and_master(self.account_id, true).count > 1
errors.add_to_base "Cannot remove master user."
return false
end
end
end
Если account.id равен нулю, мы закорачиваем "если" и уничтожение продолжается. То же самое касается, если пользователь не является основным пользователем. Зачем нам проверять, есть ли более одного главного пользователя, если уничтожаемый объект также не является основным пользователем?
Опять же, удаление может быть использовано вместо уничтожения. Но он пропускает любые * _deroy обратные вызовы, которые у вас есть или будут в будущем.