aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorDan Pickett <dpickett@enlightsolutions.com>2012-01-06 18:59:36 -0500
committerDan Pickett <dpickett@enlightsolutions.com>2012-01-06 18:59:36 -0500
commit5f472785fed770da77270300fb9ee5d7763ba7ac (patch)
tree1c2a4ad686df502345a58f8bfc5a728e6d7e5a0d /activerecord
parent984ce0cf9acf6e5bae4e95b87d6a9545579464ef (diff)
downloadrails-5f472785fed770da77270300fb9ee5d7763ba7ac.tar.gz
rails-5f472785fed770da77270300fb9ee5d7763ba7ac.tar.bz2
rails-5f472785fed770da77270300fb9ee5d7763ba7ac.zip
allow an association as a scope parameter
#4321
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/validations/uniqueness.rb5
-rw-r--r--activerecord/test/cases/validations/uniqueness_validation_test.rb12
2 files changed, 17 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb
index 55edb57206..77ddd72e59 100644
--- a/activerecord/lib/active_record/validations/uniqueness.rb
+++ b/activerecord/lib/active_record/validations/uniqueness.rb
@@ -25,6 +25,11 @@ module ActiveRecord
Array(options[:scope]).each do |scope_item|
scope_value = record.send(scope_item)
+ reflection = record.class.reflect_on_association(scope_item)
+ if reflection
+ scope_value = record.send(reflection.foreign_key)
+ scope_item = reflection.foreign_key
+ end
relation = relation.and(table[scope_item].eq(scope_value))
end
diff --git a/activerecord/test/cases/validations/uniqueness_validation_test.rb b/activerecord/test/cases/validations/uniqueness_validation_test.rb
index 327830096b..44c2812bff 100644
--- a/activerecord/test/cases/validations/uniqueness_validation_test.rb
+++ b/activerecord/test/cases/validations/uniqueness_validation_test.rb
@@ -92,6 +92,18 @@ class UniquenessValidationTest < ActiveRecord::TestCase
assert r3.valid?, "Saving r3"
end
+ def test_validate_uniqueness_with_object_scope
+ Reply.validates_uniqueness_of(:content, :scope => :topic)
+
+ t = Topic.create("title" => "I'm unique!")
+
+ r1 = t.replies.create "title" => "r1", "content" => "hello world"
+ assert r1.valid?, "Saving r1"
+
+ r2 = t.replies.create "title" => "r2", "content" => "hello world"
+ assert !r2.valid?, "Saving r2 first time"
+ end
+
def test_validate_uniqueness_scoped_to_defining_class
t = Topic.create("title" => "What, me worry?")