aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2011-02-01 11:41:14 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2011-02-01 14:25:47 -0800
commitebe485fd8ec80a1a9b86516bc6f74bc5bbba3476 (patch)
tree690ba63f9d71107e6e54c790e9742f093d34e7be /activerecord
parentee34b4cf346975d0aef7f26ef47ee2e4f3e13c37 (diff)
downloadrails-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.rb8
-rw-r--r--activerecord/test/cases/base_test.rb21
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)