diff options
Diffstat (limited to 'activemodel/lib')
| -rw-r--r-- | activemodel/lib/active_model/type.rb | 2 | ||||
| -rw-r--r-- | activemodel/lib/active_model/type/immutable_string.rb | 29 | ||||
| -rw-r--r-- | activemodel/lib/active_model/type/string.rb | 25 | 
3 files changed, 35 insertions, 21 deletions
| diff --git a/activemodel/lib/active_model/type.rb b/activemodel/lib/active_model/type.rb index f8ca7d0512..bec851594f 100644 --- a/activemodel/lib/active_model/type.rb +++ b/activemodel/lib/active_model/type.rb @@ -9,6 +9,7 @@ require 'active_model/type/date_time'  require 'active_model/type/decimal'  require 'active_model/type/decimal_without_scale'  require 'active_model/type/float' +require 'active_model/type/immutable_string'  require 'active_model/type/integer'  require 'active_model/type/string'  require 'active_model/type/text' @@ -49,6 +50,7 @@ module ActiveModel      register(:date_time, Type::DateTime)      register(:decimal, Type::Decimal)      register(:float, Type::Float) +    register(:immutable_string, Type::ImmutableString)      register(:integer, Type::Integer)      register(:string, Type::String)      register(:text, Type::Text) diff --git a/activemodel/lib/active_model/type/immutable_string.rb b/activemodel/lib/active_model/type/immutable_string.rb new file mode 100644 index 0000000000..20b8ca0cc4 --- /dev/null +++ b/activemodel/lib/active_model/type/immutable_string.rb @@ -0,0 +1,29 @@ +module ActiveModel +  module Type +    class ImmutableString < Value # :nodoc: +      def type +        :string +      end + +      def serialize(value) +        case value +        when ::Numeric, ActiveSupport::Duration then value.to_s +        when true then "t" +        when false then "f" +        else super +        end +      end + +      private + +      def cast_value(value) +        result = case value +                 when true then "t" +                 when false then "f" +                 else value.to_s +                 end +        result.freeze +      end +    end +  end +end diff --git a/activemodel/lib/active_model/type/string.rb b/activemodel/lib/active_model/type/string.rb index fd1630c751..8a91410998 100644 --- a/activemodel/lib/active_model/type/string.rb +++ b/activemodel/lib/active_model/type/string.rb @@ -1,35 +1,18 @@ +require "active_model/type/immutable_string" +  module ActiveModel    module Type -    class String < Value # :nodoc: -      def type -        :string -      end - +    class String < ImmutableString # :nodoc:        def changed_in_place?(raw_old_value, new_value)          if new_value.is_a?(::String)            raw_old_value != new_value          end        end -      def serialize(value) -        case value -        when ::Numeric, ActiveSupport::Duration then value.to_s -        when ::String then ::String.new(value) -        when true then "t" -        when false then "f" -        else super -        end -      end -        private        def cast_value(value) -        case value -        when true then "t" -        when false then "f" -        # String.new is slightly faster than dup -        else ::String.new(value.to_s) -        end +        ::String.new(super)        end      end    end | 
