1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Revert to 4.1 behavior for casting PG arrays

The user is able to pass PG string literals in 4.1, and have it
converted to an array. This is also possible in 4.2, but it would remain
in string form until saving and reloading, which breaks our
`attr = save.reload.attr` contract. I think we should deprecate this in
5.0, and only allow array input from user sources. However, this
currently constitutes a breaking change to public API that did not go
through a deprecation cycle.
This commit is contained in:
Sean Griffin 2014-12-08 11:40:41 -07:00
parent d428242c86
commit 4ed60af60d
2 changed files with 23 additions and 5 deletions

View file

@ -34,6 +34,9 @@ module ActiveRecord
end
def type_cast_from_user(value)
if value.is_a?(::String)
value = parse_pg_array(value)
end
type_cast_array(value, :type_cast_from_user)
end

View file

@ -264,11 +264,26 @@ class PostgresqlArrayTest < ActiveRecord::TestCase
def test_assigning_non_array_value
record = PgArray.new(tags: "not-an-array")
assert_equal "not-an-array", record.tags
e = assert_raises(ActiveRecord::StatementInvalid) do
record.save!
end
assert_instance_of PG::InvalidTextRepresentation, e.original_exception
assert_equal [], record.tags
assert_equal "not-an-array", record.tags_before_type_cast
assert record.save
assert_equal record.tags, record.reload.tags
end
def test_assigning_empty_string
record = PgArray.new(tags: "")
assert_equal [], record.tags
assert_equal "", record.tags_before_type_cast
assert record.save
assert_equal record.tags, record.reload.tags
end
def test_assigning_valid_pg_array_literal
record = PgArray.new(tags: "{1,2,3}")
assert_equal ["1", "2", "3"], record.tags
assert_equal "{1,2,3}", record.tags_before_type_cast
assert record.save
assert_equal record.tags, record.reload.tags
end
def test_uniqueness_validation