mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Change exists? so that it doesn't instantiate records [#6127 state:resolved]
This commit is contained in:
parent
84a4ef63a4
commit
b155fdadf3
2 changed files with 15 additions and 4 deletions
|
@ -183,7 +183,9 @@ module ActiveRecord
|
|||
def exists?(id = nil)
|
||||
id = id.id if ActiveRecord::Base === id
|
||||
|
||||
relation = select("1").limit(1)
|
||||
join_dependency = construct_join_dependency_for_association_find
|
||||
relation = construct_relation_for_association_find(join_dependency)
|
||||
relation = relation.except(:select).select("1").limit(1)
|
||||
|
||||
case id
|
||||
when Array, Hash
|
||||
|
@ -192,14 +194,13 @@ module ActiveRecord
|
|||
relation = relation.where(table[primary_key].eq(id)) if id
|
||||
end
|
||||
|
||||
relation.first ? true : false
|
||||
connection.select_value(relation.to_sql) ? true : false
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def find_with_associations
|
||||
including = (@eager_load_values + @includes_values).uniq
|
||||
join_dependency = ActiveRecord::Associations::JoinDependency.new(@klass, including, [])
|
||||
join_dependency = construct_join_dependency_for_association_find
|
||||
relation = construct_relation_for_association_find(join_dependency)
|
||||
rows = connection.select_all(relation.to_sql, 'SQL', relation.bind_values)
|
||||
join_dependency.instantiate(rows)
|
||||
|
@ -207,6 +208,11 @@ module ActiveRecord
|
|||
[]
|
||||
end
|
||||
|
||||
def construct_join_dependency_for_association_find
|
||||
including = (@eager_load_values + @includes_values).uniq
|
||||
ActiveRecord::Associations::JoinDependency.new(@klass, including, [])
|
||||
end
|
||||
|
||||
def construct_relation_for_association_calculations
|
||||
including = (@eager_load_values + @includes_values).uniq
|
||||
join_dependency = ActiveRecord::Associations::JoinDependency.new(@klass, including, arel.froms.first)
|
||||
|
|
|
@ -74,6 +74,11 @@ class FinderTest < ActiveRecord::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_exists_does_not_instantiate_records
|
||||
Developer.expects(:instantiate).never
|
||||
Developer.exists?
|
||||
end
|
||||
|
||||
def test_find_by_array_of_one_id
|
||||
assert_kind_of(Array, Topic.find([ 1 ]))
|
||||
assert_equal(1, Topic.find([ 1 ]).length)
|
||||
|
|
Loading…
Reference in a new issue