Как удалить вложенные объекты в Rails3?

Как удалить вложенные объекты в форме? Я узнал, что мне нужно добавить :allow_destroy в родительскую модель в директиве accepts_nested_attributes_for.

Кроме того, я хочу ограничить удаление. Вложенный объект следует удалять только в том случае, если родительский объект является единственным, который сохраняет ассоциацию.

Пример:

class Internship < ActiveRecord::Base
  belongs_to :company
  accepts_nested_attributes_for :company, allow_destroy => true
end

class Company < ActiveRecord::Base
  has_many :internships
end

Объяснение. Компания может проводить множество стажировок. Поэтому я не хочу удалять запись о компании, если с ней связана хотя бы одна стажировка.


person JJD    schedule 23.03.2011    source источник


Ответы (2)


Вы можете использовать зависимый => :destroy

class Internship < ActiveRecord::Base
  belongs_to :company
  accepts_nested_attributes_for :company, allow_destroy => true
end

class Company < ActiveRecord::Base
  has_many :internships, :dependent => :destroy
end
person Shiv    schedule 23.03.2011
comment
Является ли dependent => :destroy обязательным для удаления вложенных объектов (поскольку вы написали, что можете использовать)? Могу ли я использовать оператор также после belongs_to? - person JJD; 23.03.2011
comment
также есть destroy_all, вы не можете использовать его с own_to, однако вы можете создать обратный вызов before_delete. надеюсь, это поможет - person Shiv; 23.03.2011

Если вы вернете false в фильтре before_destroy, действие уничтожения будет заблокировано. Таким образом, мы можем проверить, есть ли какие-либо стажировки, связанные с компанией, и заблокировать их, если это так. Это делается в модели компании.

class Company < ActiveRecord::Base
  has_many :internships

  before_destroy :ensure_no_internships

  private

    def ensure_no_internships
      return false if self.internships.count > 0
    end

end    
person ctcherry    schedule 23.03.2011
comment
Хорошая догадка. Я пойду за return false if self.internships.count > 1. - person JJD; 23.03.2011