From 5f472785fed770da77270300fb9ee5d7763ba7ac Mon Sep 17 00:00:00 2001
From: Dan Pickett <dpickett@enlightsolutions.com>
Date: Fri, 6 Jan 2012 18:59:36 -0500
Subject: allow an association as a scope parameter

#4321
---
 activerecord/lib/active_record/validations/uniqueness.rb     |  5 +++++
 .../test/cases/validations/uniqueness_validation_test.rb     | 12 ++++++++++++
 2 files changed, 17 insertions(+)

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?")
 
-- 
cgit v1.2.3


From 3b5fbafab014325bdd42a7cae867ee5c92bc3298 Mon Sep 17 00:00:00 2001
From: Dan Pickett <dpickett@enlightsolutions.com>
Date: Fri, 6 Jan 2012 19:17:36 -0500
Subject: allow association as 1st uniqueness validation arg

#4321
---
 activerecord/lib/active_record/validations/uniqueness.rb     | 10 +++++++++-
 .../test/cases/validations/uniqueness_validation_test.rb     | 12 ++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb
index 77ddd72e59..3a741ba600 100644
--- a/activerecord/lib/active_record/validations/uniqueness.rb
+++ b/activerecord/lib/active_record/validations/uniqueness.rb
@@ -56,7 +56,15 @@ module ActiveRecord
       end
 
       def build_relation(klass, table, attribute, value) #:nodoc:
-        column = klass.columns_hash[attribute.to_s]
+        reflection = klass.reflect_on_association(attribute)
+        column = nil
+        if(reflection)
+          column = klass.columns_hash[reflection.foreign_key]
+          attribute = reflection.foreign_key
+          value = value.attributes[reflection.primary_key_column.name]
+        else
+          column = klass.columns_hash[attribute.to_s]
+        end
         value = column.limit ? value.to_s[0, column.limit] : value.to_s if !value.nil? && column.text?
 
         if !options[:case_sensitive] && value && column.text?
diff --git a/activerecord/test/cases/validations/uniqueness_validation_test.rb b/activerecord/test/cases/validations/uniqueness_validation_test.rb
index 44c2812bff..79442d68b0 100644
--- a/activerecord/test/cases/validations/uniqueness_validation_test.rb
+++ b/activerecord/test/cases/validations/uniqueness_validation_test.rb
@@ -104,6 +104,18 @@ class UniquenessValidationTest < ActiveRecord::TestCase
     assert !r2.valid?, "Saving r2 first time"
   end
 
+  def test_validate_uniqueness_with_object_arg
+    Reply.validates_uniqueness_of(: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?")
 
-- 
cgit v1.2.3