Rails, удаление дочерних элементов без удаления родительского элемента: has_many - PullRequest
7 голосов
/ 20 апреля 2010

У меня есть

class MyContainer < ActiveRecord::Base
  :has_many MyObjects, :dependent => :destroy
end

Я хочу удалить все MyObjects в контейнере без необходимости удаления MyContainer.У моей модели :dependent => :destroy, однако я не хочу удалять и заново создавать объект, потому что он медленнее.

Что-то вроде этого не работает:

@obj = MyContainer.find_by_id(10)
@obj.my_objects.delete_all

Как мне это сделать?

Ответы [ 3 ]

24 голосов
/ 20 апреля 2010

delete_all - это метод класса ActiveRecord::Base.

Вы должны использовать destroy_all. Что-то вроде:

@container = MyContainer.find_by_id(10)
@container.my_objects.destroy_all

Использование delete_all правильно будет быстрее, если вам не нужно сначала искать ваш MyContainer (или использовать его для других вещей)

MyObject.delete_all(["my_container_id = ?", 10])

РЕДАКТИРОВАТЬ: для рельсов 3

MyObject.where(my_container_id: 10).delete_all
0 голосов
/ 20 апреля 2010

Вы можете удалять объекты напрямую, как показано ниже

MyObject.delete_all(["my_container_id=?", 10])
0 голосов
/ 20 апреля 2010

Один или оба из них должны работать:

MyContainer.find(10).my_objects.destroy_all

MyContainer.find(10).my_objects.each(&:destroy)
...