diff options
Diffstat (limited to 'activerecord/lib/active_record/attribute_methods/serialization.rb')
-rw-r--r-- | activerecord/lib/active_record/attribute_methods/serialization.rb | 42 |
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 |