Вы не можете сделать это, потому что дочерний элемент в памяти не знает родителя, которому он назначен. Это знает только после сохранения. Например.
child = parent.build_child
parent.child # => child
child.parent # => nil
# BUT
child.parent = parent
child.parent # => parent
parent.child # => child
Таким образом, вы можете отчасти заставить это поведение сделать обратную связь вручную. Например
def child_with_inverse_assignment=(child)
child.parent = self
self.child_without_inverse_assignment = child
end
def build_child_with_inverse_assignment(*args)
build_child_without_inverse_assignment(*args)
child.parent = self
child
end
def create_child_with_inverse_assignment(*args)
create_child_without_inverse_assignment(*args)
child.parent = self
child
end
alias_method_chain :"child=", :inverse_assignment
alias_method_chain :build_child, :inverse_assignment
alias_method_chain :create_child, :inverse_assignment
Если вы действительно считаете это необходимым.
P.S. Причина, по которой он этого не делает сейчас, заключается в том, что это не слишком просто. Необходимо четко указать, как получить доступ к родителю / ребенку в каждом конкретном случае. Комплексный подход с картой идентичности решил бы ее, но для более новой версии есть :inverse_of
обходной путь. Некоторые обсуждения, такие как this имели место в группах новостей.