Assigning nil to a composed_of aggregate also sets its immediate value to nil. Closes #9843.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8002 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
Jeremy Kemper 2007-10-23 17:29:42 +00:00
parent 562b398fd7
commit c220e558be
3 changed files with 19 additions and 2 deletions

View File

@ -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 File

@ -148,7 +148,7 @@ module ActiveRecord
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 @@ module ActiveRecord
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 File

@ -92,4 +92,19 @@ class AggregationsTest < Test::Unit::TestCase
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