Как да изтрия вложени обекти в 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)


Можете да използвате dependent => :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, не можете да използвате това с belongs_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