mirror of https://github.com/rails/rails
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:
parent
562b398fd7
commit
c220e558be
|
@ -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`"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue