Как пропустить обратного вызова зависимого ребенка в Mongoid?
У меня есть модель User со следующей ассоциацией:
has_many :brands, dependent: :destroy, inverse_of: :owner
Но есть некоторые пользователи, у которых есть нулевое поле master_id, которое я не хочу вызывать с помощью функции call call для его ассоциации брендов. Является ли это возможным?
Я старался:
user.destroy
user.delete
Но я не мог пропустить обратный звонок в его брендовую ассоциацию.
2 ответа
Решение
Единственное, что работало для меня с Mongoid 4, было:
class Bar
has_many :foos, depedent: :delete
end
bar.assign_attributes foos: nil
bar.save # Doesn't call the relation callback above
# All the below call the relation callback
bar.foos.delete_all
bar.foos = []
bar.foos = nil
Вы могли бы пропустить dependent: :destroy
используя before_destroy
обратный вызов следующим образом:
# app/models/user.rb
has_many :brands, dependent: :destroy, inverse_of: :owner
before_destroy :prevent_destroy, prepend: true
private
def prevent_destroy
return false if self.master_id.nil?
end
См. Дальнейшую ссылку на Отмена обратных вызовов. С вышеупомянутой настройкой, если пользователь master_id
является nil
затем before_destroy
возвращается false
что мешает dependent: :destroy
от выполнения.