我有以下型号
class Parent < ActiveRecord::Base
has_many :children
end
class Child < ActiveRecord::Base
belongs_to :parent
end
我想要做的是通过parent.children.find_or_initialize_by()
更改子对象并修改子对象,然后按parent.save
保存。但孩子们并没有得救。这是代码。
# prepare a parent with a child
p = Parent.new({:name=>'parent'})
p.children << Child.new({:name => 'child'})
p.save
# modify and save child
p = Parent.first
c = p.children.find_or_initialize_by({:name=>'child'}) #=> returns the child already created above
c.name = 'new child'
p.save #=> children aren't saved
我知道这是因为find_by
方法总是返回一个新对象而不是已经加载的对象。但是,如果上面的代码有效,那么对我来说似乎更自然,因为该方法是通过ActiveRecord::Associations::CollectionProxy
调用的。我错过了什么让这个工作?或者find_by
上ActiveRecord::Associations::CollectionProxy
必须像现在一样工作吗?
(我知道我可以通过c.save
保存修改后的子项,但我希望通过parant.save
保存子项,因为我希望parent.errors引用子对象上的错误。)