मुझे लगता है कि आपने assert_queries
. का उल्लेख करके अपने स्वयं के प्रश्न का उत्तर दिया है , लेकिन यहाँ जाता है:
मैं assert_queries
. के पीछे के कोड पर एक नज़र डालने की सलाह दूंगा और इसका उपयोग करके अपनी खुद की विधि बनाने के लिए जिसका उपयोग आप प्रश्नों की गणना करने के लिए कर सकते हैं। यहां शामिल मुख्य जादू यह पंक्ति है:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
मैंने आज सुबह थोड़ा सा टिंकर किया और ActiveRecord के उन हिस्सों को निकाल दिया जो क्वेरी की गिनती करते हैं और इसके साथ आए:
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
आप ActiveRecord::Base.count_queries
. का संदर्भ देने में सक्षम होंगे विधि कहीं भी। इसे एक ब्लॉक पास करें जिसमें आपके प्रश्न चलाए जाते हैं और यह निष्पादित किए गए प्रश्नों की संख्या लौटाएगा:
ActiveRecord::Base.count_queries do
Ticket.first
end
मेरे लिए "1" लौटाता है। यह कार्य करने के लिए:इसे lib/active_record/query_counter.rb
पर एक फ़ाइल में रखें और अपने config/application.rb
. में इसकी आवश्यकता है इस तरह फाइल करें:
require 'active_record/query_counter'
अरे प्रेस्टो!
शायद थोड़ा सा स्पष्टीकरण आवश्यक है। जब हम इस लाइन को कहते हैं:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
हम रेल 3 के छोटे अधिसूचना ढांचे में शामिल हैं। यह रेल के नवीनतम प्रमुख संस्करण के लिए एक चमकदार छोटा जोड़ है जिसके बारे में वास्तव में कोई नहीं जानता है। यह हमें subscribe
. का उपयोग करके रेल के भीतर घटनाओं की सूचनाओं की सदस्यता लेने की अनुमति देता है तरीका। हम उस घटना में पास होते हैं जिसे हम पहले तर्क के रूप में सदस्यता लेना चाहते हैं, फिर कोई भी वस्तु जो call
का जवाब देती है दूसरे के रूप में।
इस मामले में जब कोई क्वेरी निष्पादित की जाती है तो हमारा छोटा क्वेरी काउंटर ActiveRecord::QueryCounter.query_count चर को कर्तव्यपूर्वक बढ़ा देगा, लेकिन केवल वास्तविक के लिए प्रश्न।
वैसे भी यह मजेदार था। मुझे आशा है कि यह आपके लिए उपयोगी होगा।