From e292ce8a4f4559aed6faef58e03ced649513cf2f Mon Sep 17 00:00:00 2001 From: Benjamin Quorning Date: Fri, 24 Jun 2016 09:50:41 +0200 Subject: Add ActiveRecord::Result#first When you only need the first element of a result set, you shouldn't need to instantiate all of hash_rows. --- activerecord/lib/active_record/result.rb | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/result.rb b/activerecord/lib/active_record/result.rb index 8e6cd6c82f..f45f664efe 100644 --- a/activerecord/lib/active_record/result.rb +++ b/activerecord/lib/active_record/result.rb @@ -75,6 +75,11 @@ module ActiveRecord hash_rows[idx] end + def first + return nil if @rows.empty? + Hash[@columns.zip(@rows.first)] + end + def last hash_rows.last end -- cgit v1.2.3 From af834fb2c03358fe9a1b8fd9ec36eb5658a63260 Mon Sep 17 00:00:00 2001 From: Benjamin Quorning Date: Thu, 23 Jun 2016 15:46:20 +0200 Subject: Remove MySQL::DatabaseStatements#select_one The implementation from abstract/database_statements.rb seems to work just fine. And with ActiveRecord::Result now implementing an optimized #first method, the performance concerns previously addressed in https://github.com/rails/rails/commit/bf79aa4fc14aeb2646331e767038acf0b77e9e7f should not be an issue. --- .../connection_adapters/mysql/database_statements.rb | 13 ------------- 1 file changed, 13 deletions(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb index 13c9b6cbd9..87f0ff7d85 100644 --- a/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/mysql/database_statements.rb @@ -13,19 +13,6 @@ module ActiveRecord result end - # Returns a record hash with the column names as keys and column values - # as values. - def select_one(arel, name = nil, binds = []) - arel, binds = binds_from_relation(arel, binds) - @connection.query_options.merge!(as: :hash) - select_result(to_sql(arel, binds), name, binds) do |result| - @connection.next_result while @connection.more_results? - result.first - end - ensure - @connection.query_options.merge!(as: :array) - end - # Returns an array of arrays containing the field values. # Order is the same as that returned by +columns+. def select_rows(sql, name = nil, binds = []) -- cgit v1.2.3 From 763de2ac1c85d3e9f82639783a55244d6c0517c2 Mon Sep 17 00:00:00 2001 From: Benjamin Quorning Date: Fri, 24 Jun 2016 09:49:42 +0200 Subject: Optimize ActiveRecord::Result#last If you only want the last element of a result set, there's no need to create all of hash_rows. Also, add a test. --- activerecord/lib/active_record/result.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'activerecord/lib') diff --git a/activerecord/lib/active_record/result.rb b/activerecord/lib/active_record/result.rb index f45f664efe..b9fd0f5326 100644 --- a/activerecord/lib/active_record/result.rb +++ b/activerecord/lib/active_record/result.rb @@ -81,7 +81,8 @@ module ActiveRecord end def last - hash_rows.last + return nil if @rows.empty? + Hash[@columns.zip(@rows.last)] end def cast_values(type_overrides = {}) # :nodoc: -- cgit v1.2.3