我想在子模型更改其父模型时设置属性
以下是一个例子:
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
现在,当我执行以下操作时,我希望从parent:
设置child.foo_idfoo = 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关联,因为这需要我在许多中添加代码更多的地方。有没有办法做到这一点?
答案 0 :(得分: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
答案 1 :(得分:0)
不确定这是否可行但是你可以覆盖parent
模型中Child
的setter
def parent=(p)
self.foo_id = p.foo_id
super(p)
end