diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-22 11:28:21 -0500 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2014-04-22 11:28:21 -0500 |
commit | 86d6f05e695c545b7e744c958c8d740d0cdf5486 (patch) | |
tree | a0ef527e1077147e5c29ea4c821bc8fee65676de /activerecord/lib | |
parent | bdd64912ac80818d338c2c7fea224b0b243ac5d4 (diff) | |
download | rails-86d6f05e695c545b7e744c958c8d740d0cdf5486.tar.gz rails-86d6f05e695c545b7e744c958c8d740d0cdf5486.tar.bz2 rails-86d6f05e695c545b7e744c958c8d740d0cdf5486.zip |
use statement cache for belongs_to relations
Diffstat (limited to 'activerecord/lib')
3 files changed, 17 insertions, 3 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb index b623f1375d..3a0a5165b6 100644 --- a/activerecord/lib/active_record/associations/collection_association.rb +++ b/activerecord/lib/active_record/associations/collection_association.rb @@ -416,7 +416,7 @@ module ActiveRecord return scope.to_a if reflection.scope_chain.any?(&:any?) conn = klass.connection - sc = reflection.association_scope_cache(conn) do + sc = reflection.association_scope_cache(conn, owner) do StatementCache.create(conn) { |params| as = AssociationScope.create { params.bind } target_scope.merge as.scope(self, conn) diff --git a/activerecord/lib/active_record/associations/singular_association.rb b/activerecord/lib/active_record/associations/singular_association.rb index ba28e91633..f2e3a4e40f 100644 --- a/activerecord/lib/active_record/associations/singular_association.rb +++ b/activerecord/lib/active_record/associations/singular_association.rb @@ -39,7 +39,18 @@ module ActiveRecord end def get_records - scope.limit(1).to_a + return scope.limit(1).to_a if reflection.scope_chain.any?(&:any?) + + conn = klass.connection + sc = reflection.association_scope_cache(conn, owner) do + StatementCache.create(conn) { |params| + as = AssociationScope.create { params.bind } + target_scope.merge(as.scope(self, conn)).limit(1) + } + end + + binds = AssociationScope.get_bind_values(owner, reflection.chain) + sc.execute binds, klass, klass.connection end def find_target diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index 467d92e53c..95485ddada 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -205,8 +205,11 @@ module ActiveRecord @scope_lock = Mutex.new end - def association_scope_cache(conn) + def association_scope_cache(conn, owner) key = conn.prepared_statements + if options[:polymorphic] + key = [key, owner.read_attribute(@foreign_type)] + end @association_scope_cache[key] ||= @scope_lock.synchronize { @association_scope_cache[key] ||= yield } |