Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 4326

Show
Ignore:
Timestamp:
05/07/06 02:03:25 (2 years ago)
Author:
bitsweat
Message:

uniq preserves order. References [4325].

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activerecord/lib/active_record/associations/association_collection.rb

    r4325 r4326  
    110110 
    111111      def uniq(collection = self) 
    112         collection.to_set.to_a 
     112        seen = Set.new 
     113        collection.inject([]) do |kept, record| 
     114          unless seen.include?(record.id) 
     115            kept << record 
     116            seen << record.id 
     117          end 
     118          kept 
     119        end 
    113120      end 
    114121 
  • trunk/activerecord/test/associations_test.rb

    r4237 r4326  
    12791279    new_project = Project.new("name" => "Grimetime") 
    12801280    amount_of_developers = 4 
    1281     developers = (0..amount_of_developers).collect {|i| Developer.create(:name => "JME #{i}") } 
    1282    
     1281    developers = (0...amount_of_developers).collect {|i| Developer.create(:name => "JME #{i}") }.reverse 
     1282 
    12831283    new_project.developer_ids = [developers[0].id, developers[1].id] 
    12841284    new_project.developers_with_callback_ids = [developers[2].id, developers[3].id] 
    12851285    assert new_project.save 
    1286      
     1286 
    12871287    new_project.reload 
    12881288    assert_equal amount_of_developers, new_project.developers.size 
    1289     amount_of_developers.times do |i| 
    1290       assert_equal developers[i].name, new_project.developers[i].name 
    1291     end 
     1289    assert_equal developers, new_project.developers 
     1290  end 
     1291 
     1292  def test_habtm_unique_order_preserved 
     1293    assert_equal [developers(:poor_jamis), developers(:jamis), developers(:david)], projects(:active_record).non_unique_developers 
     1294    assert_equal [developers(:poor_jamis), developers(:jamis), developers(:david)], projects(:active_record).developers 
    12921295  end 
    12931296 
  • trunk/activerecord/test/fixtures/project.rb

    r3287 r4326  
    11class Project < ActiveRecord::Base 
    2   has_and_belongs_to_many :developers, :uniq => true 
     2  has_and_belongs_to_many :developers, :uniq => true, :order => 'developers.name desc, developers.id desc' 
     3  has_and_belongs_to_many :non_unique_developers, :order => 'developers.name desc, developers.id desc', :class_name => 'Developer' 
    34  has_and_belongs_to_many :limited_developers, :class_name => "Developer", :limit => 1 
    45  has_and_belongs_to_many :developers_named_david, :class_name => "Developer", :conditions => "name = 'David'", :uniq => true