diff options
| -rw-r--r-- | activerecord/lib/active_record/base.rb | 11 | ||||
| -rw-r--r-- | activerecord/test/cases/base_test.rb | 6 | 
2 files changed, 15 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index e5b6e3a02f..2c4ead081d 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2626,8 +2626,15 @@ module ActiveRecord #:nodoc:          quoted = {}          connection = self.class.connection          attribute_names.each do |name| -          if column = column_for_attribute(name) -            quoted[name] = connection.quote(read_attribute(name), column) unless !include_primary_key && column.primary +          if (column = column_for_attribute(name)) && (include_primary_key || !column.primary) +            value = read_attribute(name) + +            # We need explicit to_yaml because quote() does not properly convert Time/Date fields to YAML. +            if value && self.class.serialized_attributes.has_key?(name) && (value.acts_like?(:date) || value.acts_like?(:time)) +              value = value.to_yaml +            end + +            quoted[name] = connection.quote(value, column)            end          end          include_readonly_attributes ? quoted : remove_readonly_attributes(quoted) diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 0f9eda4d09..36d30ade5e 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -1361,6 +1361,12 @@ class BasicsTest < ActiveRecord::TestCase      assert_equal(myobj, topic.content)    end +  def test_serialized_time_attribute +    myobj = Time.local(2008,1,1,1,0) +    topic = Topic.create("content" => myobj).reload +    assert_equal(myobj, topic.content) +  end +    def test_nil_serialized_attribute_with_class_constraint      myobj = MyObject.new('value1', 'value2')      topic = Topic.new  | 
