提交 55385c8a 编写于 作者: J Jon Moss

Fix issue #23625

This resolves a bug where if the primary key used is not `id` (ex:
`uuid`), and has a `validates_uniqueness_of` in the model, a uniqueness error
would be raised. This is a partial revert of commit `119b9181`, which introduced this behavior.
上级 310e4418
......@@ -17,7 +17,7 @@ def validate_each(record, attribute, value)
value = map_enum_attribute(finder_class, attribute, value)
relation = build_relation(finder_class, table, attribute, value)
if record.persisted? && finder_class.primary_key.to_s != attribute.to_s
if record.persisted?
if finder_class.primary_key
relation = relation.where.not(finder_class.primary_key => record.id_was)
else
......
......@@ -5,6 +5,7 @@
require 'models/guid'
require 'models/event'
require 'models/dashboard'
require 'models/uuid_item'
class Wizard < ActiveRecord::Base
self.abstract_class = true
......@@ -48,6 +49,10 @@ class BigIntReverseTest < ActiveRecord::Base
validates :engines_count, uniqueness: true
end
class CoolTopic < Topic
validates_uniqueness_of :id
end
class UniquenessValidationTest < ActiveRecord::TestCase
INT_MAX_VALUE = 2147483647
......@@ -480,4 +485,25 @@ def test_validate_uniqueness_ignores_itself_when_primary_key_changed
assert t.valid?, "Should be valid"
assert t.save, "Should still save t as unique"
end
def test_validate_uniqueness_uuid
skip unless current_adapter?(:PostgreSQLAdapter)
item = UuidItem.create!(uuid: SecureRandom.uuid, title: 'item1')
item.update(title: 'item1-title2')
assert_empty item.errors
item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: 'item2')
item2.update(title: 'item2-title2')
assert_empty item2.errors
end
def test_validate_uniqueness_regular_id
item = CoolTopic.create!(title: 'MyItem')
assert_empty item.errors
item2 = CoolTopic.new(id: item.id, title: 'MyItem2')
refute item2.valid?
assert_equal(["has already been taken"], item2.errors[:id])
end
end
class UuidItem < ActiveRecord::Base
end
class UuidValidatingItem < UuidItem
validates_uniqueness_of :uuid
end
......@@ -106,4 +106,9 @@
t.integer :big_int_data_points, limit: 8, array: true
t.decimal :decimal_array_default, array: true, default: [1.23, 3.45]
end
create_table :uuid_items, force: true, id: false do |t|
t.uuid :uuid, primary_key: true
t.string :title
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册