влияет ли клонирование на обратные вызовы activerecord? - PullRequest
0 голосов
/ 13 апреля 2009

У меня есть последовательность объектов ActiveRecord, которую я хочу каскадно уничтожить, но некоторые объекты не удаляются.

По сути, у меня так: -

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

где Project - это определение проекта, Task - определение задачи для этого проекта и Schedule has_many: посредством этого связывает исходный проект с другим проектом, который является расписанием исходного проекта.

Когда я создаю расписание, я выполняю глубокое клонирование исходного проекта (т. Е. Расписание является клоном исходного проекта, а каждая из задач в расписании является клоном задач в исходном расписании).

Когда я делаю schedule.destroy, я ожидал, что проект расписания и все связанные с ним задачи будут удалены. Однако удаляется только проект расписания, задачи расписания остаются.

Это не проблема кэширования, поскольку записи все еще находятся в базе данных. Кроме того, в базе данных определенно создаются отдельные задачи с идентификатором расписания в качестве идентификатора проекта и собственного уникального идентификатора.

Обратные вызовы все еще работают на клонированных объектах? Я пропустил здесь трюк?

1 Ответ

1 голос
/ 13 апреля 2009

Судя по описаниям ваших классов, я не ожидал бы каскадного удаления при уничтожении объекта Schedule. Если вы удаляете объект Project, то Rails должен пройти через дочерние задачи и расписания (не совсем уверен, что здесь находится расписание проекта) и удалить записи из-за опции :dependent => :destroy. Задачи и расписания являются дочерними для Project и не могут привести к удалению одного из родителей.

Если вы хотите удалить родительский проект при удалении расписания, я бы, вероятно, посмотрел на написание after_delete обратного вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...