2010-03-02 2 views
1

Si jeRails - Changer le parent d'un enfant et d'assurer callbacks sont exécutés

class Parent < ... 
has_many :children, 
     :before_add => :prepare_baby_room 
     :after_remove => :plan_holiday 
end 

class Child < ... 
belongs_to :parent 
:after_create => :gurgle_a_lot 
:after_remove => :cry 
end 

et je veux réassocier un enfant avec un autre parent, ce qui est la plus propre façon de le faire, tout en veillant à ce que tous les rappels sont appelés à la fois du côté parent et du côté enfant?

-à-dire que je veux t réaliser quelque chose comme ça

@child = @curr_parent.children.first 
@child.update_attributes(:parent_id, @new_parent) 

dois-je faire quelque chose comme

@child = @curr_parent.children.first 
@curr_parent.children.delete(@child) 
@new_parent.children.create(@child) 
@child.update_attributes(:parent_id, @new_parent) 

Répondre

0

Je ne l'ai pas essayé, mais je pense que vous devriez juste être en mesure de la reparenter enfant:

child = parent.children.first 
child.parent = new_parent 
child.save! 
+0

Vous pouvez essayer ceci: enfant = oldParent.children.first newParent.children << enfant –

+0

Je pense que cela souffre des mêmes probems que ive a répondu à KandadaBoggus réponds – robodisco

0

Cela devrait fonctionner aussi:

child = oldParent.children.first 
newParent.children << child 
+0

qui appellent coutume les callbacks dans la classe enfant l'enfant n'a pas été créé. De plus, seul le callback before_add newParent sera appelé. Qu'en est-il des oldParents after_remove? – robodisco