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:
Matthew Draper 2016-02-26 05:09:42 +10:30
commit fcec068bf9
2 changed files with 19 additions and 1 deletions

@ -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')