diff options
author | Jeremy Kemper <jeremy@bitsweat.net> | 2007-10-08 01:44:55 +0000 |
---|---|---|
committer | Jeremy Kemper <jeremy@bitsweat.net> | 2007-10-08 01:44:55 +0000 |
commit | 210ecaecc3d5019adf9fde496ff0a1015ec23110 (patch) | |
tree | 3c87aa59201d34cf871f8b3c2ef10e17bb53f2ab /activerecord | |
parent | e7b80cbbbc4279b9408660b9bbb1ecb9807a8497 (diff) | |
download | rails-210ecaecc3d5019adf9fde496ff0a1015ec23110.tar.gz rails-210ecaecc3d5019adf9fde496ff0a1015ec23110.tar.bz2 rails-210ecaecc3d5019adf9fde496ff0a1015ec23110.zip |
validates_uniqueness_of behaves well with single-table inheritance. Closes #3833.
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7787 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG | 4 | ||||
-rwxr-xr-x | activerecord/lib/active_record/validations.rb | 5 | ||||
-rwxr-xr-x | activerecord/test/validations_test.rb | 27 |
3 files changed, 34 insertions, 2 deletions
diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 028029fc05..befb440765 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* validates_uniqueness_of behaves well with single-table inheritance. #3833 [Gabriel Gironda, rramdas, François Beausoleil, Josh Peek, Tarmo Tänav] + * Raise ProtectedAttributeAssignmentError in development and test environments when mass-assigning to an attr_protected attribute. #9802 [Henrik N] * Speedup database date/time parsing. [Jeremy Kemper, Tarmo Tänav] @@ -1786,7 +1788,7 @@ during calendar reform. #7649, #7724 [fedot, Geoff Buesing] * MySQL: more robust test for nullified result hashes. #3124 [Stefan Kaes] -* Reloading an instance refreshes its aggregations as well as its associations. #3024 [François Beausolei] +* Reloading an instance refreshes its aggregations as well as its associations. #3024 [François Beausoleil] * Fixed that using :include together with :conditions array in Base.find would cause NoMethodError #2887 [Paul Hammmond] diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index 75b752db6e..6514c4077a 100755 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -619,6 +619,7 @@ module ActiveRecord condition_sql = "LOWER(#{record.class.table_name}.#{attr_name}) #{attribute_condition(value)}" condition_params = [value.downcase] end + if scope = configuration[:scope] Array(scope).map do |scope_item| scope_value = record.send(scope_item) @@ -626,11 +627,13 @@ module ActiveRecord condition_params << scope_value end end + unless record.new_record? condition_sql << " AND #{record.class.table_name}.#{record.class.primary_key} <> ?" condition_params << record.send(:id) end - if record.class.find(:first, :conditions => [condition_sql, *condition_params]) + + if find(:first, :conditions => [condition_sql, *condition_params]) record.errors.add(attr_name, configuration[:message]) end end diff --git a/activerecord/test/validations_test.rb b/activerecord/test/validations_test.rb index 4b91d86b18..49fc30eff7 100755 --- a/activerecord/test/validations_test.rb +++ b/activerecord/test/validations_test.rb @@ -21,6 +21,18 @@ class ProtectedPerson < ActiveRecord::Base attr_protected :first_name end +class UniqueReply < Reply + validates_uniqueness_of :content, :scope => 'parent_id' +end + +class SillyUniqueReply < UniqueReply +end + +class Topic < ActiveRecord::Base + has_many :unique_replies, :dependent => :destroy, :foreign_key => "parent_id" + has_many :silly_unique_replies, :dependent => :destroy, :foreign_key => "parent_id" +end + class ValidationsTest < Test::Unit::TestCase fixtures :topics, :developers @@ -320,6 +332,21 @@ class ValidationsTest < Test::Unit::TestCase assert r3.valid?, "Saving r3" end + def test_validate_uniqueness_scoped_to_defining_class + t = Topic.create("title" => "What, me worry?") + + r1 = t.unique_replies.create "title" => "r1", "content" => "a barrel of fun" + assert r1.valid?, "Saving r1" + + r2 = t.silly_unique_replies.create "title" => "r2", "content" => "a barrel of fun" + assert !r2.valid?, "Saving r2" + + # Should succeed as validates_uniqueness_of only applies to + # UniqueReply and it's subclasses + r3 = t.replies.create "title" => "r2", "content" => "a barrel of fun" + assert r3.valid?, "Saving r3" + end + def test_validate_uniqueness_with_scope_array Reply.validates_uniqueness_of(:author_name, :scope => [:author_email_address, :parent_id]) |