Pergunta

em Ruby on Rails 4, digamos que um pai tenha muitos filhos.Quando o pai é excluído, os filhos também devem ser excluídos.Fora isso, a criança não será excluída, a menos que seja órfã.Como fazer isso?

Eu tentei com o seguinte

class Parent < ActiveRecord::Base
  has_many :children, inverse_of: :parent, dependent: :destroy
end

class Child < ActiveRecord::Base
  belongs_to :parent, inverse_of: :children
  before_destroy :checks
private
  def checks
    not parent # true if orphan
  end
end

Com a verificação before_destroy, entretanto, nada é excluído.Existe alguma maneira de informar esse método se o motivo da chamada é a exclusão do pai?

É uma coisa estranha de se pedir?Quero dizer, impedindo a exclusão de crianças.

Foi útil?

Solução

Trabalhando a partir da resposta da carpa em Trilhos:como desativar o retorno de chamada before_destroy quando ele está sendo destruído porque o pai está sendo destruído (:dependent =>:destroy), tente isto:

Criança:

belongs_to :parent
before_destroy :prevent_destroy
attr_accessor :destroyed_by_parent

...

private

def prevent_destroy
  if !destroyed_by_parent
    self.errors[:base] << "You may not delete this child."
    return false
  end
end

Pai:

has_many :children, :dependent => :destroy
before_destroy :set_destroyed_by_parent, prepend: true

...

private

def set_destroyed_by_parent
  children.each{ |child| child.destroyed_by_parent = true }
end

Tivemos que fazer isso porque estamos usando a paranóia, e dependent: delete_all iria excluí-los permanentemente em vez de excluí-los suavemente.Meu instinto me diz que há uma maneira melhor de fazer isso, mas não é óbvio, e isso dá conta do recado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top