Catch-22 in association through join model

I have a many-to-many relationship defined by a join model:

class Product < ActiveRecord::Base

has_many :bundlings

has_many :bundles, :through => :bundlings


class Bundling < ActiveRecord::Base

belongs_to :product

belongs_to :bundle


class Bundle < ActiveRecord::Base

has_many :bundlings

has_many :products, :through => :bundlings


Additionally, Bundle validates that it contains at least two products.

Then I tried to create a new Bundle like this:

fixtures :products

bundle =…) # can’t save bundle yet since

                      # I haven't yet added two products

bundle.products << products(:product_one)

bundle.products << products(:product_two)!

The “<<” operation raises an**ActiveRecord:: HasManyThroughCantAssociateNewRecords exception, saying that both bundle and the product need to have an ID to use “<<” on a through association. However, in order to obtain an ID, I need to save bundle, but bundle cannot be saved (i.e. pass validation) unless I have added two products to it through “<<” – Catch 22.

Any thoughts?



Do you mean:

  1. Create a unprepared bundled. Mark the unprepared status in one of its DB columns.

  2. Save the unprepared bundle to DB to generate an ID for it

  3. Add the products to the saved bundle.

  4. When the second product is added, unmark the unprepared status in the DB column.

This seems like a good solution, even though it would bypass the validation mechanism of ActiveRecord, and has a little bit more maintenance of states…