2

我有一个对象模型,例如:

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

4

3 回答 3

2

您可以使用关联回调

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在 child 中并不是一个坏主意。

于 2012-10-04T16:29:52.703 回答
0

基本答案是肯定的,父母知道它的孩子。这是通过parent_id在子表中有一个字段来完成的。每当父母想要找到它的孩子时,它所要做的就是向该表询问所有具有正确父母ID的孩子。

这是关系数据库的基本概念,非常值得阅读更多内容,以确保您了解使用模型关联时发生的情况。

编辑:对您的示例进行轻微的代码更正

a_parent = Parent.create
child = Child.create(:parent => a_parent)
于 2012-10-04T16:00:51.373 回答
-2

您需要确保进行适当的迁移。见这里。既然你已经这样做了,上面的代码将自动关联a_parent到它的child.

于 2012-10-04T15:12:23.670 回答