diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-01 11:41:14 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2011-02-01 14:25:47 -0800 |
commit | ebe485fd8ec80a1a9b86516bc6f74bc5bbba3476 (patch) | |
tree | 690ba63f9d71107e6e54c790e9742f093d34e7be /activerecord | |
parent | ee34b4cf346975d0aef7f26ef47ee2e4f3e13c37 (diff) | |
download | rails-ebe485fd8ec80a1a9b86516bc6f74bc5bbba3476.tar.gz rails-ebe485fd8ec80a1a9b86516bc6f74bc5bbba3476.tar.bz2 rails-ebe485fd8ec80a1a9b86516bc6f74bc5bbba3476.zip |
serialize can take an arbitrary code object
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/lib/active_record/base.rb | 8 | ||||
-rw-r--r-- | activerecord/test/cases/base_test.rb | 21 |
2 files changed, 28 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index f66b84935c..5310b55a92 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -536,7 +536,13 @@ module ActiveRecord #:nodoc: # serialize :preferences # end def serialize(attr_name, class_name = Object) - serialized_attributes[attr_name.to_s] = Coders::YAMLColumn.new(class_name) + coder = if [:load, :dump].all? { |x| class_name.respond_to?(x) } + class_name + else + Coders::YAMLColumn.new(class_name) + end + + serialized_attributes[attr_name.to_s] = coder end # Guesses the table name (in forced lower-case) based on the name of the class in the diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index a58d5dec81..7c677d55ca 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -1018,6 +1018,27 @@ class BasicsTest < ActiveRecord::TestCase assert_equal topic.content, false end + def test_serialize_with_coder + coder = Class.new { + # Identity + def load(thing) + thing + end + + # base 64 + def dump(thing) + [thing].pack('m') + end + }.new + + Topic.serialize(:content, coder) + s = 'hello world' + topic = Topic.new(:content => s) + assert topic.save + topic = topic.reload + assert_equal [s].pack('m'), topic.content + end + def test_quote author_name = "\\ \001 ' \n \\n \"" topic = Topic.create('author_name' => author_name) |