Receiving already loaded object from find_by method of ActiveRecord::Associations::CollectionProx

I have the following models

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
 belongs_to :parent
end

What I want to do is changing a child object by
parent.children.find_or_initialize_by() and modify the child object,
then
save it by parent.save. But the children doens’t get saved. Here’s the
code.

# 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

I know this is because find_by method always returns a new object rather
than the one already loaded. But it seems more natural to me if the code
above works because the method is invoked through
ActiveRecord::Associations::CollectionProxy. Am I missing anything to
get
this to work? Or are there any reasons that find_by on
ActiveRecord::Associations::CollectionProxy have to work as it currently
does?

(I know I can save the modified child by c.save, but I want to save the
child through parant.save, because I want the errors on child object to
be
referenced by parent.errors.)

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs