Merge pull request #23887 from jrafanie/fix_uniqueness_validation_on_after_create
Fix uniqueness validation with an after_create hook.
This commit is contained in:
commit
fcec068bf9
@ -18,7 +18,7 @@ def validate_each(record, attribute, value)
|
||||
relation = build_relation(finder_class, table, attribute, value)
|
||||
if record.persisted?
|
||||
if finder_class.primary_key
|
||||
relation = relation.where.not(finder_class.primary_key => record.id_was)
|
||||
relation = relation.where.not(finder_class.primary_key => record.id_was || record.id)
|
||||
else
|
||||
raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
|
||||
end
|
||||
|
@ -53,6 +53,14 @@ class CoolTopic < Topic
|
||||
validates_uniqueness_of :id
|
||||
end
|
||||
|
||||
class TopicWithAfterCreate < Topic
|
||||
after_create :set_author
|
||||
|
||||
def set_author
|
||||
update_attributes!(:author_name => "#{title} #{id}")
|
||||
end
|
||||
end
|
||||
|
||||
class UniquenessValidationTest < ActiveRecord::TestCase
|
||||
INT_MAX_VALUE = 2147483647
|
||||
|
||||
@ -469,6 +477,16 @@ def test_validate_uniqueness_ignores_itself_when_primary_key_changed
|
||||
assert t.save, "Should still save t as unique"
|
||||
end
|
||||
|
||||
def test_validate_uniqueness_with_after_create_performing_save
|
||||
TopicWithAfterCreate.validates_uniqueness_of(:title)
|
||||
topic = TopicWithAfterCreate.create!(:title => "Title1")
|
||||
assert topic.author_name.start_with?("Title1")
|
||||
|
||||
topic2 = TopicWithAfterCreate.new(:title => "Title1")
|
||||
refute topic2.valid?
|
||||
assert_equal(["has already been taken"], topic2.errors[:title])
|
||||
end
|
||||
|
||||
def test_validate_uniqueness_uuid
|
||||
skip unless current_adapter?(:PostgreSQLAdapter)
|
||||
item = UuidItem.create!(uuid: SecureRandom.uuid, title: 'item1')
|
||||
|
Loading…
Reference in New Issue
Block a user