attributes= operation *appends* instead of replacing for accepts_nested_attributes_for with has_many

When using “attributes=” for an object with a accepts_nested_attributes_for a model

that has a has_many relationship will cause the has_many array to be appended-to

instead of being replaced as would be expected by a straight assignment operation.

See this example:

class Member < ActiveRecord::Base

has_many :posts

accepts_nested_attributes_for :posts

end

class Post < ActiveRecord::Base

belongs_to :member

end

m=Member.new

p={:name => ‘joe’, :posts_attributes => [{:title=>‘t1’},{:title=>‘t2’}]}

m.attributes = p

m.posts.size ----> 2

m.attributes = p

m.posts.size ----> 4

Is this a feature or a bug? If it is a feature, how is it supposed to be used?

When using "attributes=" for an object with a accepts_nested_attributes_for a model that has a has_many relationship will cause the has_many array to be appended-to instead of being replaced as would be expected by a straight assignment operation.

attributes= has always behaved like that ( the name is bad - it's not really an accessor at all. The newer name is assign_attributes)

Fred

With nested attributes, you’ll wind up creating new records unless the entries in :posts_attributes have an :id key which indicates they’re existing records to be updated.

–Matt Jones