public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Fixed AssociationCollection#<< resulting in unexpected values in @target when 
:uniq => true

Signed-off-by: Michael Koziarski <michael@koziarski.com>
Ernie Miller (author)
Sat Aug 02 08:47:05 -0700 2008
NZKoz (committer)
Fri Aug 08 06:19:08 -0700 2008
commit  7f6e7ba1f7e8735f1c3f30ba125b5432f00d2a70
tree    6ef0f774359e80d8c20dd4fd244edab61bd00cec
parent  06e4eb49eaabde76e38e4f275619fe2df51f1e0a
...
344
345
346
347
 
348
349
350
...
344
345
346
 
347
348
349
350
0
@@ -344,7 +344,7 @@ module ActiveRecord
0
           callback(:before_add, record)
0
           yield(record) if block_given?
0
           @target ||= [] unless loaded?
0
-          @target << record
0
+          @target << record unless @reflection.options[:uniq] && @target.include?(record)
0
           callback(:after_add, record)
0
           record
0
         end
...
299
300
301
 
 
 
 
 
 
 
 
 
 
 
302
303
304
...
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
0
@@ -299,6 +299,17 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
0
     assert_equal 3, projects(:active_record, :reload).developers.size
0
   end
0
 
0
+  def test_uniq_option_prevents_duplicate_push
0
+    project = projects(:active_record)
0
+    project.developers << developers(:jamis)
0
+    project.developers << developers(:david)
0
+    assert_equal 3, project.developers.size
0
+
0
+    project.developers << developers(:david)
0
+    project.developers << developers(:jamis)
0
+    assert_equal 3, project.developers.size
0
+  end
0
+
0
   def test_deleting
0
     david = Developer.find(1)
0
     active_record = Project.find(1)

Comments