From 774ff18c095145f544e845dbb940378546748969 Mon Sep 17 00:00:00 2001 From: Andrew Kaspick Date: Wed, 14 Dec 2011 20:13:03 -0600 Subject: Allow nested attributes in associations to update values in it's owner object. Fixes a regression from 3.0.x --- activerecord/lib/active_record/associations/association.rb | 2 ++ activerecord/lib/active_record/base.rb | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/associations/association.rb b/activerecord/lib/active_record/associations/association.rb index d1e3ff8e38..861dda618a 100644 --- a/activerecord/lib/active_record/associations/association.rb +++ b/activerecord/lib/active_record/associations/association.rb @@ -230,6 +230,8 @@ module ActiveRecord end def build_record(attributes, options) + attributes = (attributes || {}).reverse_merge(creation_attributes) + reflection.build_association(attributes, options) do |record| record.assign_attributes( create_scope.except(*record.changed), diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 9215a68cfc..2d2909054d 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1776,6 +1776,7 @@ MSG attributes = new_attributes.stringify_keys multi_parameter_attributes = [] + nested_parameter_attributes = [] @mass_assignment_options = options unless options[:without_protection] @@ -1786,12 +1787,21 @@ MSG if k.include?("(") multi_parameter_attributes << [ k, v ] elsif respond_to?("#{k}=") - send("#{k}=", v) + if v.is_a?(Hash) + nested_parameter_attributes << [ k, v ] + else + send("#{k}=", v) + end else raise(UnknownAttributeError, "unknown attribute: #{k}") end end + # assign any deferred nested attributes after the base attributes have been set + nested_parameter_attributes.each do |k,v| + send("#{k}=", v) + end + @mass_assignment_options = nil assign_multiparameter_attributes(multi_parameter_attributes) end -- cgit v1.2.3