2009-04-13 12 views
0

カスケードする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 

、タスク、そのプロジェクトのタスクの定義をしてhas_manyのをスケジュール:それは別のプロジェクトに元のプロジェクトをリンクしてこれは元のプロジェクトのスケジュールです。

私はスケジュールを作成するときに元のプロジェクトをディープクローニングしています(つまり、スケジュールは元のプロジェクトのクローンであり、スケジュール上の各タスクは元のスケジュールのタスクのクローンです)。

私はschedule.destroyを実行すると、私はスケジュールプロジェクトとそれに関連するすべてのタスクが削除されると予想します。ただし、スケジュールプロジェクトのみが削除され、スケジュールタスクはそのまま残ります。

これは、レコードがデータベースに残っているため、キャッシュの問題ではありません。また、プロジェクトIDと独自のIDとしてスケジュールidを持つデータベースには、明確に別々のタスクが作成されています。

クローンオブジェクトでコールバックが実行されますか?私はここでトリックを逃したことがありますか?

答えて

1

あなたのクラスの説明から、Scheduleオブジェクトを破棄するとカスケード削除は期待できません。プロジェクトオブジェクトを削除した場合、Railsは子タスクとスケジュール(ここではどのプロジェクトスケジュールが本当にわからない)を通過し、:dependent => :destroyオプションのためにレコードを削除する必要があります。タスクとスケジュールはProjectの子であり、親を削除することはありません。

スケジュールが削除されたときに親プロジェクトを削除する場合は、after_deleteコールバックを作成することをお勧めします。

+0

ありがとう、マイケル。あなたが正しいです、私はこれを間違った方法で回していました。 after_deleteコールバックを使用して見ていきます。どうもありがとう。 –

関連する問題