aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2014-06-10 11:06:55 -0300
committerRafael Mendonça França <rafaelmfranca@gmail.com>2014-06-10 11:06:55 -0300
commitbfb8b139aaeecd3aaadb99c3f483c1420e59c384 (patch)
treed7d5ded07b5ecf6311da1355dea5add5f4f0f1e3 /activerecord
parent4b8d0b803f454058eb363a101b512b98e4ec198d (diff)
parentb5aa210bf75eacb86d423f677991aef1468cb3c6 (diff)
downloadrails-bfb8b139aaeecd3aaadb99c3f483c1420e59c384.tar.gz
rails-bfb8b139aaeecd3aaadb99c3f483c1420e59c384.tar.bz2
rails-bfb8b139aaeecd3aaadb99c3f483c1420e59c384.zip
Merge pull request #15607 from sgrif/sg-array-type-cast
Inline PG array type casting helper
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/cast.rb12
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/column.rb20
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb30
3 files changed, 28 insertions, 34 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
index 666d1cf6e3..bb54de05c8 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb
@@ -67,10 +67,6 @@ module ActiveRecord
end
end
- def string_to_array(string, oid) # :nodoc:
- parse_pg_array(string).map {|val| type_cast_array(oid, val)}
- end
-
private
HstorePair = begin
@@ -103,14 +99,6 @@ module ActiveRecord
"\"#{value}\""
end
end
-
- def type_cast_array(oid, value)
- if ::Array === value
- value.map {|item| type_cast_array(oid, item)}
- else
- oid.type_cast_from_database value
- end
- end
end
end
end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
index a579746815..847fd4dded 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/column.rb
@@ -4,6 +4,8 @@ module ActiveRecord
module ConnectionAdapters
# PostgreSQL-specific extensions to column definitions in a table.
class PostgreSQLColumn < Column #:nodoc:
+ extend PostgreSQL::Cast
+
attr_accessor :array
def initialize(name, default, cast_type, sql_type = nil, null = true, default_function = nil)
@@ -17,24 +19,6 @@ module ActiveRecord
@default_function = default_function
end
-
- # :stopdoc:
- class << self
- include PostgreSQL::Cast
-
- # Loads pg_array_parser if available. String parsing can be
- # performed quicker by a native extension, which will not create
- # a large amount of Ruby objects that will need to be garbage
- # collected. pg_array_parser has a C and Java extension
- begin
- require 'pg_array_parser'
- include PgArrayParser
- rescue LoadError
- require 'active_record/connection_adapters/postgresql/array_parser'
- include PostgreSQL::ArrayParser
- end
- end
- # :startdoc:
end
end
end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb b/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb
index 0e9dcd8c0c..87817fe8d1 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rb
@@ -10,11 +10,33 @@ module ActiveRecord
@subtype = subtype
end
- def type_cast(value)
- if ::String === value
- ConnectionAdapters::PostgreSQLColumn.string_to_array value, @subtype
+ def type_cast_from_database(value)
+ if value.is_a?(::String)
+ type_cast_array(parse_pg_array(value))
else
- value
+ super
+ end
+ end
+
+ # Loads pg_array_parser if available. String parsing can be
+ # performed quicker by a native extension, which will not create
+ # a large amount of Ruby objects that will need to be garbage
+ # collected. pg_array_parser has a C and Java extension
+ begin
+ require 'pg_array_parser'
+ include PgArrayParser
+ rescue LoadError
+ require 'active_record/connection_adapters/postgresql/array_parser'
+ include PostgreSQL::ArrayParser
+ end
+
+ private
+
+ def type_cast_array(value)
+ if value.is_a?(::Array)
+ value.map { |item| type_cast_array(item) }
+ else
+ @subtype.type_cast_from_database(value)
end
end
end