mrbrdo mrbrdo - 1 year ago 90
Ruby Question

Add association (<<) without commiting to database

Is it possible in Rails to add an association to an existing record without immediately commiting this change to the database?
E.g. if I have Post has_many :tags

post.tags << Tag.first

This will commit to database immediately. I've tried other ways instead of <<, but without success (what I want is to create the association when saving the parent object).
Is it possible to get behavior like when you are adding association to a new record with build? name: "whatever"

I think this is kind of inconsistent in Rails, in some cases it would be useful to have an option to do this.

In other words I want

post.tags << Tag.first # don't hit the DB here! # hit the DB here!

Answer Source

This should work in Rails 3.2 and Rails 4:


See this gist:

Note that saving the parent saves the child and that child.parent_id is NOT set until you save it.

EDIT 12/6/2015: For a polymorphic record:

post.association(:tags).send(:build_through_record, Tag.first)
# Tested in Rails 4.2.5