From bf4eed4580d57f21e55b928910abcc1932ef1fc8 Mon Sep 17 00:00:00 2001 From: Michael Rykov Date: Tue, 16 Jul 2013 02:23:24 -0700 Subject: [PATCH] Ensure Uniqueness validation works with STI --- lib/dm-validations/validators/uniqueness_validator.rb | 3 ++- spec/fixtures/corporate_world.rb | 4 ++++ .../uniqueness_validator/uniqueness_validator_spec.rb | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/dm-validations/validators/uniqueness_validator.rb b/lib/dm-validations/validators/uniqueness_validator.rb index 67979ae6..54844b45 100644 --- a/lib/dm-validations/validators/uniqueness_validator.rb +++ b/lib/dm-validations/validators/uniqueness_validator.rb @@ -42,8 +42,9 @@ def valid?(target) opts[subject] = target.__send__(subject) } + property = target.model.properties[field_name] resource = DataMapper.repository(target.repository.name) do - target.model.first(opts) + property.model.first(opts) end return true if resource.nil? diff --git a/spec/fixtures/corporate_world.rb b/spec/fixtures/corporate_world.rb index fdba0613..8d292c66 100644 --- a/spec/fixtures/corporate_world.rb +++ b/spec/fixtures/corporate_world.rb @@ -18,6 +18,7 @@ class Department property :id, Serial property :name, String, :unique_index => true + property :type, Discriminator validates_uniqueness_of :name end @@ -34,6 +35,9 @@ class User validates_uniqueness_of :user_name, :when => :signing_up_for_department_account, :scope => [:department] validates_uniqueness_of :user_name, :when => :signing_up_for_organization_account, :scope => [:organisation] end + + # For STI uniqueness testing + class BigDepartment < Department; end end end end diff --git a/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb b/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb index b88db31a..3e185d8c 100644 --- a/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +++ b/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb @@ -26,6 +26,14 @@ it_should_behave_like "invalid model" end + + describe "with duplicate name in a child class" do + before do + @model = DataMapper::Validations::Fixtures::BigDepartment.new(:name => "HR") + end + + it_should_behave_like "invalid model" + end end describe 'DataMapper::Validations::Fixtures::Organisation' do