Sha256: 13e6b3d18b15a56778fd6a82310f0d8283b97440e3f6d58ee751e4c89b7fbaf7

Contents?: true

Size: 1.23 KB

Versions: 3

Compression:

Stored size: 1.23 KB

Contents

#------------------------------------------------------------------------------
def assert_queries(num = 1, &block)
  expect(ActiveRecord::Base.count_queries(&block)).to eq num
end

# http://stackoverflow.com/questions/5490411/counting-the-number-of-queries-performed
#------------------------------------------------------------------------------
module ActiveRecord
  class QueryCounter
    cattr_accessor :query_count do
      0
    end

    IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/]

    def call(name, start, finish, message_id, values)
      # FIXME: this seems bad. we should probably have a better way to indicate
      # the query was cached
      unless 'CACHE' == values[:name]
        self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r }
      end
    end
  end
end

ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

module ActiveRecord
  class Base
    def self.count_queries(&block)
      ActiveRecord::QueryCounter.query_count = 0
      yield
      ActiveRecord::QueryCounter.query_count
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
dm_preferences-1.5.1 spec/support/assert_queries.rb
dm_preferences-1.5 spec/support/assert_queries.rb
dm_preferences-1.0 spec/support/assert_queries.rb