Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

moved attribute translation to an object

  • Loading branch information...
commit 9c07e389be340e4d25298148cf39d10218ffb1a0 1 parent ee161d1
@tenderlove tenderlove authored
View
26 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 @@ def read_attribute(attr_name)
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)
View
28 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
Please sign in to comment.
Something went wrong with that request. Please try again.