aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-04-22 12:29:08 +0200
committerJosé Valim <jose.valim@gmail.com>2010-04-22 12:29:08 +0200
commit9476daa829f7dd0681121e042dd1356af0d50ca0 (patch)
tree906efeda77ef1d7891f7aaf12d831e2f71cf7069 /activemodel
parent81fb742488e696ee7a7a8b1a620bc93deb1fad77 (diff)
downloadrails-9476daa829f7dd0681121e042dd1356af0d50ca0.tar.gz
rails-9476daa829f7dd0681121e042dd1356af0d50ca0.tar.bz2
rails-9476daa829f7dd0681121e042dd1356af0d50ca0.zip
Speed up xml serializer by computing values just once and remove unecessary code duplication.
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/serializers/xml.rb35
1 files changed, 17 insertions, 18 deletions
diff --git a/activemodel/lib/active_model/serializers/xml.rb b/activemodel/lib/active_model/serializers/xml.rb
index c226359ea7..ee3e0eab06 100644
--- a/activemodel/lib/active_model/serializers/xml.rb
+++ b/activemodel/lib/active_model/serializers/xml.rb
@@ -1,6 +1,7 @@
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/hash/conversions'
+require 'active_support/core_ext/hash/slice'
module ActiveModel
module Serializers
@@ -12,8 +13,10 @@ module ActiveModel
class Attribute #:nodoc:
attr_reader :name, :value, :type
- def initialize(name, serializable)
+ def initialize(name, serializable, raw_value=nil)
@name, @serializable = name, serializable
+ @raw_value = raw_value || @serializable.send(name)
+
@type = compute_type
@value = compute_value
end
@@ -51,20 +54,17 @@ module ActiveModel
protected
def compute_type
- value = @serializable.send(name)
- type = Hash::XML_TYPE_NAMES[value.class.name]
- type ||= :string if value.respond_to?(:to_str)
+ type = Hash::XML_TYPE_NAMES[@raw_value.class.name]
+ type ||= :string if @raw_value.respond_to?(:to_str)
type ||= :yaml
type
end
def compute_value
- value = @serializable.send(name)
-
if formatter = Hash::XML_FORMATTING[type.to_s]
- value ? formatter.call(value) : nil
+ @raw_value ? formatter.call(@raw_value) : nil
else
- value
+ @raw_value
end
end
end
@@ -72,7 +72,7 @@ module ActiveModel
class MethodAttribute < Attribute #:nodoc:
protected
def compute_type
- Hash::XML_TYPE_NAMES[@serializable.send(name).class.name] || :string
+ Hash::XML_TYPE_NAMES[@raw_value.class.name] || :string
end
end
@@ -92,25 +92,24 @@ module ActiveModel
# then because <tt>:except</tt> is set to a default value, the second
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
# <tt>:only</tt> is set, always delete <tt>:except</tt>.
- def serializable_attribute_names
- attribute_names = @serializable.attributes.keys.sort
-
+ def serializable_attributes_hash
+ attributes = @serializable.attributes
if options[:only].any?
- attribute_names &= options[:only]
+ attributes.slice(*options[:only])
elsif options[:except].any?
- attribute_names -= options[:except]
+ attributes.except(*options[:except])
+ else
+ attributes
end
-
- attribute_names
end
def serializable_attributes
- serializable_attribute_names.collect { |name| Attribute.new(name, @serializable) }
+ serializable_attributes_hash.map { |name, value| self.class::Attribute.new(name, @serializable, value) }
end
def serializable_method_attributes
Array.wrap(options[:methods]).inject([]) do |methods, name|
- methods << MethodAttribute.new(name.to_s, @serializable) if @serializable.respond_to?(name.to_s)
+ methods << self.class::MethodAttribute.new(name.to_s, @serializable) if @serializable.respond_to?(name.to_s)
methods
end
end