diff options
author | Sam DeCesare <sam@samdecesare.com> | 2018-04-09 17:35:33 -0700 |
---|---|---|
committer | Sam DeCesare <sam@samdecesare.com> | 2018-04-09 18:49:52 -0700 |
commit | 99910dddf28faac31d6a3d4800460f1bc308bb83 (patch) | |
tree | 4b08bd565a1b2d901bd1e3b5af2ea5b5537b1881 /activerecord/lib/active_record | |
parent | 601e31b362b2f59bed988de716f4b931b2aa0950 (diff) | |
download | rails-99910dddf28faac31d6a3d4800460f1bc308bb83.tar.gz rails-99910dddf28faac31d6a3d4800460f1bc308bb83.tar.bz2 rails-99910dddf28faac31d6a3d4800460f1bc308bb83.zip |
Fix .new with multiple through associations
This fixes a bug with building an object that has multiple
`has_many :through` associations through the same object.
Previously, when building the object via .new, the intermediate
object would be created instead of just being built.
Here's an example:
Given a GameBoard, that has_one Owner and Collection through Game.
The following line would cause a game object to be created in the
database.
GameBoard.new(owner: some_owner, collection: some_collection)
Whereas, if passing only one of those associations into `.new` would
cause the Game object to be built and not created in the database.
Now the above code will only build the Game object, and not save it.
Diffstat (limited to 'activerecord/lib/active_record')
-rw-r--r-- | activerecord/lib/active_record/associations/has_one_through_association.rb | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/has_one_through_association.rb b/activerecord/lib/active_record/associations/has_one_through_association.rb index 491282adf7..019bf0729f 100644 --- a/activerecord/lib/active_record/associations/has_one_through_association.rb +++ b/activerecord/lib/active_record/associations/has_one_through_association.rb @@ -28,7 +28,11 @@ module ActiveRecord end if through_record - through_record.update(attributes) + if through_record.new_record? + through_record.assign_attributes(attributes) + else + through_record.update(attributes) + end elsif owner.new_record? || !save through_proxy.build(attributes) else |