From 9c07e389be340e4d25298148cf39d10218ffb1a0 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Tue, 31 Jan 2012 15:17:31 -0800 Subject: moved attribute translation to an object --- .../lib/active_record/attribute_methods/read.rb | 26 ++++++++------------ .../lib/active_record/attributes/translator.rb | 28 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 16 deletions(-) create mode 100644 activerecord/lib/active_record/attributes/translator.rb diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb index 6d36e6a004..66f4b0b6c6 100644 --- a/activerecord/lib/active_record/attribute_methods/read.rb +++ b/activerecord/lib/active_record/attribute_methods/read.rb @@ -1,3 +1,5 @@ +require 'active_record/attributes/translator' + module ActiveRecord module AttributeMethods module Read @@ -126,28 +128,20 @@ module ActiveRecord self.class.type_cast_attribute(attr_name, @attributes, @attributes_cache) end - private - def cached_cast_attribute(attr_name, method) - @attributes_cache[attr_name] ||= cast_attribute(attr_name, method) - end - - def cast_attribute(attr_name, method) - v = @attributes.fetch(attr_name) { missing_attribute(attr_name, caller) } - v && send(method, attr_name, v) - end - def cast_serialized(attr_name, value) - value.unserialized_value + def attribute_translator + Attributes::Translator.new(@attributes, @columns_hash) end - def cast_tz_conversion(attr_name, value) - value = cast_column(attr_name, value) - value.acts_like?(:time) ? value.in_time_zone : value + def cached_cast_attribute(attr_name, method) + @attributes_cache[attr_name] ||= cast_attribute(attr_name, method) end - def cast_column(attr_name, value) - @columns_hash[attr_name].type_cast value + def cast_attribute(attr_name, method) + attribute_translator.cast_attribute(attr_name, method) do + missing_attribute(attr_name, caller) + end end def attribute(attribute_name) diff --git a/activerecord/lib/active_record/attributes/translator.rb b/activerecord/lib/active_record/attributes/translator.rb new file mode 100644 index 0000000000..62fb874215 --- /dev/null +++ b/activerecord/lib/active_record/attributes/translator.rb @@ -0,0 +1,28 @@ +module ActiveRecord + module Attributes + class Translator # :nodoc: + def initialize(attributes, column_types) + @attributes = attributes + @column_types = column_types + end + + def cast_attribute(attr_name, method) + v = @attributes.fetch(attr_name) { yield } + v && send(method, attr_name, v) + end + + def cast_serialized(attr_name, value) + value.unserialized_value + end + + def cast_tz_conversion(attr_name, value) + value = cast_column(attr_name, value) + value.acts_like?(:time) ? value.in_time_zone : value + end + + def cast_column(attr_name, value) + @column_types[attr_name].type_cast value + end + end + end +end -- cgit v1.2.3