Search code examples
ruby-on-railsruby-on-rails-3activerecordmass-assignment

Mass assignment with update_attributes does not update collection_singular_ids


I have a simple User model which is associated to many Town objects using a join table (has_and_belongs_to_many). Now I'd like to update the towns belonging to a particular user by assigning a list of comma-separated town ids (coming directly from the form sent as a HTTP POST parameter).

The user object is saved using the following controller code:

@current_object.update_attributes(params[:user])

The params[:user] includes town_ids which is, for example, set to 1,4,6.

Unfortunately, this does not update the user-town associations at all. However, if I do it manually, it works beautifully well:

User.find(:first).town_ids = "1,4,6" # this saves automatically

Could it just be that it is not possible to mass-assign these collection_singular_ids fields?

My user model contains the following:

has_and_belongs_to_many :towns

# necessary for mass-assignment, otherwise it results in an exception:
attr_accessible :town_ids

Any help is greatly appreciated.


Solution

  • You have to pass the town_ids as an array:

    User.find(:first).update_attributes(:town_ids=>[1,4,6])
    

    If you pass the ids as a string Rails will attempt to convert the string to an integer:

    "1,4,6".to_i # => 1