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子ではそれほど悪い考えではありません。

于 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 に答える