O clonagem afetar activerecord retornos de chamada?
-
09-09-2019 - |
Pergunta
Eu tenho uma seqüência de ActiveRecord objetos que eu quero cascata destruir, mas alguns dos objetos não estão sendo removidos.
Essencialmente eu tenho a seguinte: -
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
has_many :schedules, :dependent => :destroy
has_many :project_schedules, :through => :schedules, :class_name => "Project", :dependent => :destroy
end
class Schedule < ActiveRecord::Base
belongs_to :project_schedule, :class_name => "Project"
belongs_to :project
end
class Task < ActiveRecord::Base
belongs_to :project
end
onde Projeto é uma definição de um projeto, a tarefa A definição de uma tarefa nesse projeto e agendar um has_many:. Através de que as ligações de um projeto original para outro projeto, que é um cronograma do projeto original
Quando eu criar uma agenda, Eu sou profundamente-clonagem do projeto original (ou seja, a programação é um clone do projeto original e cada uma das tarefas no calendário são clones das tarefas no cronograma original).
Quando eu faço um schedule.destroy eu esperaria que o projeto cronograma e toda a tarefas associadas a ser eliminado. No entanto, apenas o projeto cronograma for excluído, as tarefas de agendamento permanecem.
Este não é um problema de cache como os registros ainda estão no banco de dados. Além disso, existem tarefas definitivamente separados sendo criados no banco de dados com ID de programação como o ID de projeto e id aunique própria.
Do ainda callbacks fogo em objetos clonados? Eu perdi um truque aqui?
Solução
A partir do olhar de seus descrições de classe, eu não esperar uma eliminação em cascata quando você destruir um objeto de agendamento. Se você excluir um objeto de projeto, então Rails devem passar por tarefas criança e Programações (realmente não sei o cronograma do projeto é aqui) e excluir os registros por causa da opção :dependent => :destroy
. Tarefas e horários são filhos de projeto e não causaria um pai para ser apagada.
Se você quiser remover o projeto pai quando um planejamento é excluído eu provavelmente iria olhar para escrever um callback after_delete
.