如何根据父模型设置模型属性?

时间:2012-08-17 18:46:24

标签: ruby-on-rails ruby-on-rails-3

我想在子模型更改其父模型时设置属性

以下是一个例子:

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_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关联,因为这需要我在许多中添加代码更多的地方。有没有办法做到这一点?

2 个答案:

答案 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