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

Fix uniqueness validation with out of range value

This commit is contained in:
Andrey Voronkov 2015-04-08 19:28:45 +03:00
parent 0a120a818d
commit 1a36be390e
3 changed files with 31 additions and 0 deletions

View file

@ -1,3 +1,7 @@
* Uniqueness validation with out of range value fixed
*Andrey Voronkov*
* MySQL: `:charset` and `:collation` support for string and text columns. * MySQL: `:charset` and `:collation` support for string and text columns.
Example: Example:

View file

@ -76,6 +76,8 @@ module ActiveRecord
klass.connection.case_sensitive_comparison(table, attribute, column, value) klass.connection.case_sensitive_comparison(table, attribute, column, value)
end end
klass.unscoped.where(comparison) klass.unscoped.where(comparison)
rescue RangeError
klass.none
end end
def scope_relation(record, table, relation) def scope_relation(record, table, relation)

View file

@ -34,6 +34,19 @@ class TopicWithUniqEvent < Topic
validates :event, uniqueness: true validates :event, uniqueness: true
end end
class BigIntTest < ActiveRecord::Base
PG_MAX_INTEGER = 2147483647
self.table_name = 'cars'
validates :engines_count, uniqueness: true, inclusion: { in: 0..PG_MAX_INTEGER }
end
class BigIntReverseTest < ActiveRecord::Base
PG_MAX_INTEGER = 2147483647
self.table_name = 'cars'
validates :engines_count, inclusion: { in: 0..PG_MAX_INTEGER }
validates :engines_count, uniqueness: true
end
class UniquenessValidationTest < ActiveRecord::TestCase class UniquenessValidationTest < ActiveRecord::TestCase
fixtures :topics, 'warehouse-things' fixtures :topics, 'warehouse-things'
@ -86,6 +99,18 @@ class UniquenessValidationTest < ActiveRecord::TestCase
assert t2.errors[:title] assert t2.errors[:title]
end end
if current_adapter? :PostgreSQLAdapter
def test_validate_uniqueness_when_integer_out_of_range
entry = BigIntTest.create(engines_count: (BigIntTest::PG_MAX_INTEGER + 1))
assert_equal entry.errors[:engines_count], ['is not included in the list']
end
def test_validate_uniqueness_when_integer_out_of_range_show_order_does_not_matter
entry = BigIntReverseTest.create(engines_count: (BigIntTest::PG_MAX_INTEGER + 1))
assert_equal entry.errors[:engines_count], ['is not included in the list']
end
end
def test_validates_uniqueness_with_newline_chars def test_validates_uniqueness_with_newline_chars
Topic.validates_uniqueness_of(:title, :case_sensitive => false) Topic.validates_uniqueness_of(:title, :case_sensitive => false)