0

親が変更されたときに子モデルに属性を設定したい

次に例を示します。

create_table "children", :force => true do |t|
  t.integer "parent_id"
  t.string  "parent_type"
  t.integer "foo_id"
end

create_table "fathers", :force => true do |t|
  t.integer "foo_id"
end

create_table "mothers", :force => true do |t|
  t.integer "foo_id"
end

create_table "foos", :force => true do |t|
end

class Foo < ActiveRecord::Base
end

class Child < ActiveRecord::Base
  belongs_to :parent, :polymorphic => true
  belongs_to :foo
end

class Father < ActiveRecord::Base
  belongs_to :foo
end

class Mother < ActiveRecord::Base
  belongs_to :foo
end

ここで、次を実行すると、child.foo_id が親から設定されるようになります。

foo = Foo.new {|foo| foo.id = 1}
parent = Father.new {|father| father.foo = foo}
child = Child.new
child.parent = parent

コールバックなどfoo_idではなく、すぐに設定する必要があります。before_validation

これは簡単な例ですが、実際にはもっと多くのポリモーフィック型があります。after_addこれは、Father と Motherのアソシエーションのコールバックで実現できることはわかっていますhas_manyが、可能であれば、has_many アソシエーションを追加する必要はなく、コードをさらに多くの場所に追加する必要があるためです。これを行う方法はありますか?

4

2 に答える 2

0

あなたが達成したいことを明確に理解していません。

これかも

parent = Parent.new(foo_id=>123456)
child = Child.new(:parent=>parent,:foo_id=>parent.foo_id)

if parent.save
   child.save
end

また

parent = Parent.new(foo_id=>123456)

if parent.save
   Child.create(:parent=>parent,:foo_id=>parent.foo_id)
end
于 2012-08-17T19:12:07.807 に答える
0

parentこれが機能するかどうかはわかりませんが、Childモデルのセッターを上書きできるかもしれません

def parent=(p)
  self.foo_id = p.foo_id
  super(p)
end
于 2016-08-11T15:33:27.573 に答える