我有一个像这样的对象模型:
class parent < ActiveRecord::Base
has_many: children
end
class child < ActiveRecord::Base
belongs_to: parent
end
我的问题是,如果我这样做:
a_parent = Parent.create
child = Child.create(parent: a_parent)
是否有一种干净的方式让父母知道新的子对象,这样我就可以做一些事情(比如让父母发出出生公告)?我宁愿不让孩子这样做(他们甚至不能拼写,更不用说买得起邮票了)。 :)
我可以想象使用观察者或子进程中的after_create来调用父对象的公共方法(调用parent.look_at_me)。理想情况下,我喜欢我在父母中定义的东西。还有其他想法吗?
答案 0 :(得分:1)
class Parent
has_many :children, :after_add => :send_birth_announcement
def send_birth_announcement(child)
# ...
end
end
这适用于以下情况:
a_parent.children << a_child
a_parent.children.create(child_attributes)
然而,ORM是漏洞抽象,因此很难错过这样的回调。在没有实例化父母的情况下创建孩子总是可能的,所以孩子中的after_create
可能不是一个想法。
答案 1 :(得分:0)
基本答案是肯定的,父母知道其子女。这是通过在子表中包含parent_id
字段来完成的。每当父母想要找到它的孩子时,所有需要做的就是为所有具有正确父母身份的孩子提供该表。
这是关系数据库的基本概念,非常值得一读,以确保您了解使用模型关联时发生的情况。
编辑: 对您的示例进行轻微的代码修正
a_parent = Parent.create
child = Child.create(:parent => a_parent)
答案 2 :(得分:-2)
您需要确保执行适当的迁移。见here。鉴于您已完成此操作,上述代码会自动将a_parent
与其child
相关联。