Has Many Relationship: collection_ids= Method Useless?

When modifying a model that has a has_one or has_many relationship people usually create form that will submit the id of the selected associated object. Rails takes this into consideration with validations: validate_presence_of :country will validate if country or country_id has been set.

In Rails, providing the associated ID works fine with has_one but if you try to do this with a has_many:

form_for(@country) do |form|   form.select :state_ids, @states   form.select :state_ids, @states   #etc...

The selected state_ids are written to the DB as soon as they're assigned. What's the reasoning behind this? How is one supposed to assign multiple collection ids via a form?

accepts_nested_attributes_for doesn't work out too well either because you're just setting IDs -a field that is explicitly ignored by accepts_nested except when testing whether or not the given params are new.

You have to send them as an array, and assign them as an array too.

For example, View form.select("state_ids", @states) form.select("state_ids", @states)

Controller @whatever.state_ids = params[:state_ids]

You'll have to figure out the exact syntax, but that's the idea.

Hope it helps.

That's the problem. As soon as you make that assignment the IDs are written to the db. You'd have to say: Whatever.tranaction do   @what = Whatever.new(params[:whatever])   #other stuff   if @what.valid? .... end

Which can result in an unnecessarily large transaction scope. Though this is somewhat expected since << and co. also write to the DB on assignment.