diff options
author | Rafael França <rafaelmfranca@gmail.com> | 2016-08-03 06:54:15 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-03 06:54:15 -0300 |
commit | ba03e6adf30f24e60e5045808f1b56267d6e5d4d (patch) | |
tree | 0fd7fed7c0d0d613da342d35a7ceb5eef8667f1c /activerecord/lib/active_record/associations | |
parent | cdb347bdb342f31249bc67e61683b8e977148089 (diff) | |
parent | 954b197056752435495fa3684e7b9c8d68015d08 (diff) | |
download | rails-ba03e6adf30f24e60e5045808f1b56267d6e5d4d.tar.gz rails-ba03e6adf30f24e60e5045808f1b56267d6e5d4d.tar.bz2 rails-ba03e6adf30f24e60e5045808f1b56267d6e5d4d.zip |
Merge pull request #26035 from kamipo/avoid_duplicated_set_inverse_instance
Avoid duplicated `set_inverse_instance` for target scope
Diffstat (limited to 'activerecord/lib/active_record/associations')
3 files changed, 16 insertions, 23 deletions
diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb index fea9f5d7f3..c8805d107b 100644 --- a/activerecord/lib/active_record/associations/collection_association.rb +++ b/activerecord/lib/active_record/associations/collection_association.rb @@ -455,23 +455,20 @@ module ActiveRecord end private - def get_records - return scope.to_a if skip_statement_cache? - - 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) - } - end - - binds = AssociationScope.get_bind_values(owner, reflection.chain) - sc.execute binds, klass, klass.connection - end def find_target - records = get_records + return scope.to_a if skip_statement_cache? + + 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) + } + end + + binds = AssociationScope.get_bind_values(owner, reflection.chain) + records = sc.execute(binds, klass, conn) records.each { |record| set_inverse_instance(record) } records end diff --git a/activerecord/lib/active_record/associations/has_many_through_association.rb b/activerecord/lib/active_record/associations/has_many_through_association.rb index 36fc381343..ddd0b59cc1 100644 --- a/activerecord/lib/active_record/associations/has_many_through_association.rb +++ b/activerecord/lib/active_record/associations/has_many_through_association.rb @@ -196,7 +196,7 @@ module ActiveRecord def find_target return [] unless target_reflection_has_associated_record? - get_records + super end # NOTE - not sure that we can actually cope with inverses here diff --git a/activerecord/lib/active_record/associations/singular_association.rb b/activerecord/lib/active_record/associations/singular_association.rb index f913f0852a..1fe9a23263 100644 --- a/activerecord/lib/active_record/associations/singular_association.rb +++ b/activerecord/lib/active_record/associations/singular_association.rb @@ -44,8 +44,8 @@ module ActiveRecord scope.scope_for_create.stringify_keys.except(klass.primary_key) end - def get_records - return scope.limit(1).records if skip_statement_cache? + def find_target + return scope.take if skip_statement_cache? conn = klass.connection sc = reflection.association_scope_cache(conn, owner) do @@ -56,11 +56,7 @@ module ActiveRecord end binds = AssociationScope.get_bind_values(owner, reflection.chain) - sc.execute binds, klass, klass.connection - end - - def find_target - if record = get_records.first + if record = sc.execute(binds, klass, conn).first set_inverse_instance record end end |