aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/attribute_methods/serialization.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods/serialization.rb')
-rw-r--r--activerecord/lib/active_record/attribute_methods/serialization.rb42
1 files changed, 42 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/attribute_methods/serialization.rb b/activerecord/lib/active_record/attribute_methods/serialization.rb
new file mode 100644
index 0000000000..686754fbc2
--- /dev/null
+++ b/activerecord/lib/active_record/attribute_methods/serialization.rb
@@ -0,0 +1,42 @@
+module ActiveRecord
+ module AttributeMethods
+ module Serialization
+ extend ActiveSupport::Concern
+
+ module ClassMethods
+ def define_method_attribute(attr_name)
+ if serialized_attributes.include?(attr_name)
+ generated_attribute_methods.module_eval(<<-CODE, __FILE__, __LINE__)
+ def _#{attr_name}
+ @attributes_cache['#{attr_name}'] ||= @attributes['#{attr_name}']
+ end
+ alias #{attr_name} _#{attr_name}
+ CODE
+ else
+ super
+ end
+ end
+
+ def cacheable_column?(column)
+ serialized_attributes.include?(column.name) || super
+ end
+ end
+
+ def type_cast_attribute(column, value)
+ coder = self.class.serialized_attributes[column.name]
+
+ if column.text? && coder
+ unserialized_object = coder.load(@attributes[column.name])
+
+ if @attributes.frozen?
+ unserialized_object
+ else
+ @attributes[column.name] = unserialized_object
+ end
+ else
+ super
+ end
+ end
+ end
+ end
+end