ActiveRecord: adding children to a has_many parent


#1

given parent.list is a has_many of Child, I’ve found that if I do this:

child = Child.new(...)
parent.list << child

rails will select * all of parent.list before doing the insert of the
new child (if parent.list isn’t already loaded). This is -bad- because
my parent.list is huge.

So instead, I do this:

child = Child.new(...)
child.parent = parent
child.save!

This ensures a single insert and also throws an exception if any DB
constraints are violated, thus ensuring any encompassing transactions
and/or top level logging is handled.

is this generally the right thing to do with rails? I’m a noob coming
from enterprise development in other languages.

Or is there some other magic way to add to parent.list with the above
kind behavior?


#2

bataras wrote:

So instead, I do this:

child = Child.new(…)
child.parent = parent
child.save!

The most terse way would be

parent.list.create(…)

If you want to defer saving you can instead use the “build” method.


We develop, watch us RoR, in numbers too big to ignore.


#3

Cool. Thanks. I’ll use that. In one case though, I have to create a new
child that “belongs_to” 2 different kinds of parents. So for that, I’ll
have to use the build method to make it happen in a single insert.