Forum: Ruby on Rails attributes= operation *appends* instead of replacing for accepts_nested_attributes_for with has_many

Posted by xop (Guest)
on 2013-02-26 20:36
(Received via mailing list)
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?
Posted by Frederick Cheung (Guest)
on 2013-02-26 23:32
(Received via mailing list)
On Tuesday, February 26, 2013 7:35:23 PM UTC, xop wrote:
> 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
Posted by Matt Jones (Guest)
on 2013-02-28 15:08
(Received via mailing list)
On Tuesday, 26 February 2013 14:35:23 UTC-5, xop wrote:
> class Member < ActiveRecord::Base
>
> 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?
>

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
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.