2015-02-18 4 views
9

Я пытаюсь использовать зависимый:: уничтожить без успеха.зависимый уничтожить не работает

Простой пример. Я создать простое приложение со следующим:

rails g model parent 
rails g model child parent:references 

Добавить следующие строки в parent.rb

has_many :children, dependent: :destroy 

Я делаю следующее испытание на рельсы консоли (рельсы с)

p = Parent.create! 
c = Child.create! 
c.parent = p 
c.save 
#check association 
Child.first == Child.first.parent.children.first 
p.delete 
#This should return 0 
Child.count == 0 

И Child.count возвращает 1.

Что мне не хватает?

Благодаря

+4

Вам необходимо выполнить 'p.destroy' .. –

+1

Чтобы обеспечить выполнение обратных вызовов before_destroy и after_destroy объекта или любых зависимых параметров ассоциации, используйте #destroy: http://api.rubyonrails.org/classes/ActiveRecord/Persistence. HTML # метод-я-удалить – siekfried

ответ

16

4.2.2.4 :dependent

Если вы установите :dependent опцию:

  • :destroy, когда объект будет уничтожен, #destroy будет называться на связанных с ним объектов.
  • :delete, когда объект уничтожается, все связанные с ним объекты будут удалены непосредственно из базы данных без вызывая их метод #destroy.

В соответствии с вашими настройками вы должны выполнить p.destroy.

The :dependent Опция может иметь разные значения, указывающие, как выполняется удаление. Для получения дополнительной информации см. Документацию по этому параметру для разных типов ассоциаций. Когда не предоставляется опция, поведение не должно ничего делать с соответствующими записями при уничтожении записи.

Для has_many, destroy и destroy_all всегда будет вызывать destroy метод записи (ами), которые удаляются так, что обратные вызовы выполняются. Однако delete и delete_all либо сделают удаление в соответствии со стратегией , указанной в параметре :dependent, либо если нет опции :dependent, то она будет следовать стратегии по умолчанию. Стратегия по умолчанию: :nullify () устанавливает внешние ключи в nil), за исключением has_many :through, где стратегия по умолчанию - delete_all (удалите записи объединения, не запуская их обратные вызовы).

5

delete Вызов методы для объекта производного ActiveRecord будет выдавать прямое DELETE заявления сделать базу данных, пропуская обратные вызовы ActiveRecord и конфигурацию, такие как dependent: destroy.

Я считаю, что вам нужен метод destroy.

Вы также можете настроить внешний ключ в базе данных и настроить его на каскад при удалении, это может иметь смысл, в зависимости от ваших потребностей.

Смежные вопросы