diff options
author | Sean Griffin <sean@thoughtbot.com> | 2015-07-25 13:05:05 -0600 |
---|---|---|
committer | Sean Griffin <sean@thoughtbot.com> | 2015-07-25 13:05:53 -0600 |
commit | 119b9181ece399c67213543fb5227b82688b536f (patch) | |
tree | e490ef2e65f67ad884dac0f3f04d352f5edcb452 | |
parent | 9caf2cbf268137113447ac8156b862b5d84063b5 (diff) | |
download | rails-119b9181ece399c67213543fb5227b82688b536f.tar.gz rails-119b9181ece399c67213543fb5227b82688b536f.tar.bz2 rails-119b9181ece399c67213543fb5227b82688b536f.zip |
Properly allow uniqueness validations on primary keys.
This is an alternate implementation of #20966.
[Sean Griffin & presskey]
-rw-r--r-- | activerecord/CHANGELOG.md | 6 | ||||
-rw-r--r-- | activerecord/lib/active_record/validations/uniqueness.rb | 4 | ||||
-rw-r--r-- | activerecord/test/cases/validations/uniqueness_validation_test.rb | 19 |
3 files changed, 28 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 99d9101347..4cf54ffeb1 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,9 @@ +* Properly allow uniqueness validations on primary keys. + + Fixes #20966. + + *Sean Griffin & presskey* + * Don't raise an error if an association failed to destroy when `destroy` was called on the parent (as opposed to `destroy!`). diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb index 5106f4e127..32d17a1392 100644 --- a/activerecord/lib/active_record/validations/uniqueness.rb +++ b/activerecord/lib/active_record/validations/uniqueness.rb @@ -17,7 +17,9 @@ module ActiveRecord value = map_enum_attribute(finder_class, attribute, value) relation = build_relation(finder_class, table, attribute, value) - relation = relation.where.not(finder_class.primary_key => record.id) if record.persisted? + if record.persisted? && finder_class.primary_key.to_s != attribute.to_s + relation = relation.where.not(finder_class.primary_key => record.id) + end relation = scope_relation(record, table, relation) relation = relation.merge(options[:conditions]) if options[:conditions] diff --git a/activerecord/test/cases/validations/uniqueness_validation_test.rb b/activerecord/test/cases/validations/uniqueness_validation_test.rb index 2608c84be2..ceca2c8366 100644 --- a/activerecord/test/cases/validations/uniqueness_validation_test.rb +++ b/activerecord/test/cases/validations/uniqueness_validation_test.rb @@ -427,4 +427,23 @@ class UniquenessValidationTest < ActiveRecord::TestCase assert reply.valid? assert topic.valid? end + + def test_validate_uniqueness_of_custom_primary_key + klass = Class.new(ActiveRecord::Base) do + self.table_name = "keyboards" + self.primary_key = :key_number + + validates_uniqueness_of :key_number + + def self.name + "Keyboard" + end + end + + klass.create!(key_number: 10) + key2 = klass.create!(key_number: 11) + + key2.key_number = 10 + assert_not key2.valid? + end end |