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的关联进行回调来完成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 回答