Как пропустить обратного вызова зависимого ребенка в 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 от выполнения.

Другие вопросы по тегам