Skip to content
Browse files

Assigning nil to a composed_of aggregate also sets its immediate valu…

…e to nil. Closes #9843.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8002 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 562b398 commit c220e558be33e30a7946d3604d45ba671b2e7c31 @jeremy jeremy committed Oct 23, 2007
View
2 activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Assigning nil to a composed_of aggregate also sets its immediate value to nil. #9843 [Chris Cruft]
+
* Ensure that mysql quotes table names with database names correctly. Closes #9911 [crayz]
"foo.bar" => "`foo`.`bar`"
View
4 activerecord/lib/active_record/aggregations.rb
@@ -148,7 +148,7 @@ def reader_method(name, class_name, mapping, allow_nil)
mapping = (Array === mapping.first ? mapping : [ mapping ])
allow_nil_condition = if allow_nil
- mapping.collect { |pair| "!read_attribute(\"#{pair.first}\").nil?"}.join(" && ")
+ mapping.collect { |pair| "!read_attribute(\"#{pair.first}\").nil?"}.join(" || ")
else
"true"
end
@@ -169,10 +169,10 @@ def writer_method(name, class_name, mapping, allow_nil)
if allow_nil
module_eval <<-end_eval, __FILE__, __LINE__
def #{name}=(part)
+ @#{name} = part.freeze
if part.nil?
#{mapping.collect { |pair| "@attributes[\"#{pair.first}\"] = nil" }.join("\n")}
else
- @#{name} = part.freeze
#{mapping.collect { |pair| "@attributes[\"#{pair.first}\"] = part.#{pair.last}" }.join("\n")}
end
end
View
15 activerecord/test/aggregations_test.rb
@@ -92,4 +92,19 @@ def test_allow_nil_address_set_to_nil
def test_nil_raises_error_when_allow_nil_is_false
assert_raises(NoMethodError) { customers(:david).balance = nil }
end
+
+ def test_allow_nil_address_loaded_when_only_some_attributes_are_nil
+ customers(:zaphod).address_street = nil
+ customers(:zaphod).save
+ customers(:zaphod).reload
+ assert_kind_of Address, customers(:zaphod).address
+ assert customers(:zaphod).address.street.nil?
+ end
+
+ def test_nil_assignment_results_in_nil
+ customers(:david).gps_location = GpsLocation.new('39x111')
+ assert_not_equal nil, customers(:david).gps_location
+ customers(:david).gps_location = nil
+ assert_equal nil, customers(:david).gps_location
+ end
end

0 comments on commit c220e55

Please sign in to comment.
Something went wrong with that request. Please try again.