mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #15686 from sgrif/sg-pg-int-arrays
PG arrays should type cast user input
This commit is contained in:
commit
1c41d3b982
2 changed files with 15 additions and 6 deletions
|
@ -12,12 +12,16 @@ module ActiveRecord
|
|||
|
||||
def type_cast_from_database(value)
|
||||
if value.is_a?(::String)
|
||||
type_cast_array(parse_pg_array(value))
|
||||
type_cast_array(parse_pg_array(value), :type_cast_from_database)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def type_cast_from_user(value)
|
||||
type_cast_array(value, :type_cast_from_user)
|
||||
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
|
||||
|
@ -32,11 +36,11 @@ module ActiveRecord
|
|||
|
||||
private
|
||||
|
||||
def type_cast_array(value)
|
||||
def type_cast_array(value, method)
|
||||
if value.is_a?(::Array)
|
||||
value.map { |item| type_cast_array(item) }
|
||||
value.map { |item| type_cast_array(item, method) }
|
||||
else
|
||||
@subtype.type_cast_from_database(value)
|
||||
@subtype.public_send(method, value)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -97,8 +97,13 @@ class PostgresqlArrayTest < ActiveRecord::TestCase
|
|||
|
||||
def test_type_cast_integers
|
||||
x = PgArray.new(ratings: ['1', '2'])
|
||||
assert x.save!
|
||||
assert_equal(['1', '2'], x.ratings)
|
||||
|
||||
assert_equal([1, 2], x.ratings)
|
||||
|
||||
x.save!
|
||||
x.reload
|
||||
|
||||
assert_equal([1, 2], x.ratings)
|
||||
end
|
||||
|
||||
def test_select_with_strings
|
||||
|
|
Loading…
Reference in a new issue