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:
parent
d428242c86
commit
4ed60af60d
2 changed files with 23 additions and 5 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue