diff --git a/lib/data_mapper/validation/rule/uniqueness.rb b/lib/data_mapper/validation/rule/uniqueness.rb index 6ae184d4..d5dd1412 100644 --- a/lib/data_mapper/validation/rule/uniqueness.rb +++ b/lib/data_mapper/validation/rule/uniqueness.rb @@ -46,8 +46,9 @@ def valid?(resource) opts[subject] = resource.__send__(subject) } + property = resource.model.properties[attribute_name] other_resource = DataMapper.repository(resource.repository.name) do - resource.model.first(opts) + property.model.first(opts) end return true if other_resource.nil? diff --git a/spec/fixtures/corporate_world.rb b/spec/fixtures/corporate_world.rb index 37710ed3..eb495707 100644 --- a/spec/fixtures/corporate_world.rb +++ b/spec/fixtures/corporate_world.rb @@ -17,11 +17,24 @@ class Department include DataMapper::Resource property :id, Serial + + property :type, Discriminator + property :name, String, :unique_index => true validates_uniqueness_of :name end + class SpecialDepartment < Department + property :special_id, String + validates_uniqueness_of :special_id + end + + class VerySpecialDepartment < Department + property :special_id, String + validates_uniqueness_of :special_id + end + class User include DataMapper::Resource diff --git a/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb b/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb index b88db31a..593581bc 100644 --- a/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb +++ b/spec/integration/uniqueness_validator/uniqueness_validator_spec.rb @@ -28,6 +28,54 @@ end end + describe 'DataMapper::Validations::Fixtures::SpecialDepartment' do + before :all do + DataMapper::Validations::Fixtures::Department.destroy! + + DataMapper::Validations::Fixtures::Department.create(:name => "HR").should be_saved + end + + describe "with a duplicate name" do + before do + @model = DataMapper::Validations::Fixtures::SpecialDepartment.new(:name => "HR") + end + + it_should_behave_like "invalid model" + end + end + + describe 'DataMapper::Validations::Fixtures::SpecialDepartment' do + before :all do + DataMapper::Validations::Fixtures::Department.destroy! + + DataMapper::Validations::Fixtures::SpecialDepartment.create(:name => "HR", :special_id => "1234").should be_saved + end + + describe "with a duplicate special_id" do + before do + @model = DataMapper::Validations::Fixtures::SpecialDepartment.new(:name => "Other Dept.", :special_id => "1234") + end + + it_should_behave_like "invalid model" + end + end + + describe 'DataMapper::Validations::Fixtures::VerySpecialDepartment' do + before :all do + DataMapper::Validations::Fixtures::Department.destroy! + + DataMapper::Validations::Fixtures::SpecialDepartment.create(:name => "HR", :special_id => "1234").should be_saved + end + + describe "with a special_id also used by a SpecialDepartment" do + before do + @model = DataMapper::Validations::Fixtures::VerySpecialDepartment.new(:name => "Some Very Special Other Dept.", :special_id => "1234") + end + + it_should_behave_like "valid model" + end + end + describe 'DataMapper::Validations::Fixtures::Organisation' do before :all do DataMapper::Validations::Fixtures::Organisation.destroy!