mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Respect new records for CollectionProxy#uniq
Currently if `CollectionProxy` has more than one new record,
`CollectionProxy#uniq` result is incorrect.
And `CollectionProxy#uniq` was aliased to `distinct` in a1bb6c8b06
.
But the `uniq` method and the `SELECT DISTINCT` method are different
methods. The doc in `CollectionProxy` is for the `SELECT DISTINCT`
method, not for the `uniq` method.
Therefore, reverting the alias in `CollectionProxy` to fix the
inconsistency and to have the both methods.
This commit is contained in:
parent
ee7556cb08
commit
0ec967aa66
6 changed files with 19 additions and 13 deletions
|
@ -246,13 +246,6 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
def distinct
|
||||
seen = {}
|
||||
load_target.find_all do |record|
|
||||
seen[record.id] = true unless seen.key?(record.id)
|
||||
end
|
||||
end
|
||||
|
||||
# Replace this collection with +other_array+. This will perform a diff
|
||||
# and delete/add only records that have changed.
|
||||
def replace(other_array)
|
||||
|
|
|
@ -718,6 +718,12 @@ module ActiveRecord
|
|||
@association.destroy(*records)
|
||||
end
|
||||
|
||||
##
|
||||
# :method: distinct
|
||||
#
|
||||
# :call-seq:
|
||||
# distinct(value = true)
|
||||
#
|
||||
# Specifies whether the records should be unique or not.
|
||||
#
|
||||
# class Person < ActiveRecord::Base
|
||||
|
@ -732,10 +738,17 @@ module ActiveRecord
|
|||
#
|
||||
# person.pets.select(:name).distinct
|
||||
# # => [#<Pet name: "Fancy-Fancy">]
|
||||
def distinct
|
||||
@association.distinct
|
||||
#
|
||||
# person.pets.select(:name).distinct.distinct(false)
|
||||
# # => [
|
||||
# # #<Pet name: "Fancy-Fancy">,
|
||||
# # #<Pet name: "Fancy-Fancy">
|
||||
# # ]
|
||||
|
||||
#--
|
||||
def uniq
|
||||
load_target.uniq
|
||||
end
|
||||
alias uniq distinct
|
||||
|
||||
def calculate(operation, column_name)
|
||||
null_scope? ? scope.calculate(operation, column_name) : super
|
||||
|
|
|
@ -383,7 +383,7 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|||
dev.projects << projects(:active_record)
|
||||
|
||||
assert_equal 3, dev.projects.size
|
||||
assert_equal 1, dev.projects.distinct.size
|
||||
assert_equal 1, dev.projects.uniq.size
|
||||
end
|
||||
|
||||
def test_distinct_before_the_fact
|
||||
|
|
|
@ -919,6 +919,7 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
company.clients_of_firm.build("name" => "Another Client")
|
||||
company.clients_of_firm.build("name" => "Yet Another Client")
|
||||
assert_equal 4, company.clients_of_firm.size
|
||||
assert_equal 4, company.clients_of_firm.uniq.size
|
||||
end
|
||||
|
||||
def test_collection_not_empty_after_building
|
||||
|
|
|
@ -413,7 +413,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
|
|||
author = Author.includes(:taggings).find authors(:david).id
|
||||
expected_taggings = taggings(:welcome_general, :thinking_general)
|
||||
assert_no_queries do
|
||||
assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
|
||||
assert_equal expected_taggings, author.taggings.uniq.sort_by(&:id)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -785,7 +785,6 @@ class RelationTest < ActiveRecord::TestCase
|
|||
expected_taggings = taggings(:welcome_general, :thinking_general)
|
||||
|
||||
assert_no_queries do
|
||||
assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
|
||||
assert_equal expected_taggings, author.taggings.uniq.sort_by(&:id)
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue