具有多个孩子的ActiveRecord对象是否知道孩子何时属于它?

时间:2012-10-04 15:02:35

标签: ruby-on-rails ruby activerecord

我有一个像这样的对象模型:

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)。理想情况下,我喜欢我在父母中定义的东西。还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Association callbacks

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相关联。