从ActiveRecord :: Associations :: CollectionProx的find_by方法接收已加载的对象

时间:2014-06-02 05:55:52

标签: ruby-on-rails ruby activerecord rails-activerecord

我有以下型号

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_byActiveRecord::Associations::CollectionProxy必须像现在一样工作吗?

(我知道我可以通过c.save保存修改后的子项,但我希望通过parant.save保存子项,因为我希望parent.errors引用子对象上的错误。)

0 个答案:

没有答案