سؤال

يمكنني حقًا استخدام مجموعة أخرى من العيون على هذا ، لذا اعتقدت أنني سأقوم بنشرها هنا. منذ فترة كتبت امتدادًا أساسيًا لـ ActivereCord لأغطيتي التعليمية. لقد قرأت عن Railties مؤخرًا واعتقدت أنني سأحاول تشغيلها مع Rails 3. اعتقدت أنني سأقوم بتجميعها كجوهرة للتعرف على هذه العملية أيضًا. إذا تخطيت Railtie وقمت بذلك فقط كقرود تقليدي في مجلد المهيئات ، فإنه يعمل بشكل جيد. باستخدام Railtie ... لا شيء.

من مظهره ، لم يتم تنفيذ Railtie الخاص بي أبدًا ، وبالتالي يبدو أنه لا شيء آخر يحدث.

هل يرى أي شخص أي خطأ هنا؟

أي اقتراحات لأفضل الممارسات أو التحسينات نرحب أيضًا.

مشروع Gemfile:

gem 'sql_explain', :path => "/home/mike/projects/sql_explain/"

Gemspec:

...
  spec.files = %w(README.rdoc sql_explain.rb lib/sql_explain.rb lib/railtie.rb sql_explain.gemspec)
...

sql_explain.rb

require 'lib/railtie.rb'

Railtie.rb

require 'active_record'
require 'sql_explain'

module SqlExplain
  class Railtie < Rails::Railtie
    railtie_name :sql_explain
    initializer 'sql_explain.extend.activerecord' do
      if defined?(ActiveRecord)
        ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
      end
    end
  end
end

sql_explain.rb

module SqlExplain
  module AR
    def self.included(base_klass)
      base_klass.send :alias_method_chain, :select, :explain
    end


    def select_with_explain(sql, name = nil)
      @connection.query_with_result = true
      result = execute('explain ' + sql, :skip_logging)
      rows = []
      result.each_hash { |row| rows << row }
      result.free
      @connection.more_results && @connection.next_result    # invoking stored procedures with CLIENT_MULTI_RESULTS requires this to tidy up else connection will be dropped
      exp_string = ""
      rows.each{|row| row.each_pair{|k,v| exp_string += " #{k}: #{v} |"}}
      log(exp_string, "Explanation") {}
      select_without_explain(sql, name)
    end
  end
end
هل كانت مفيدة؟

المحلول

يبدو أنك قد حصلت بالفعل على هذا ، ولكن تذكر أنه مع Rails 3 يمكنك القيام به:

ActiveSupport.on_load :active_record do
  ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
end

سيضمن ذلك أن يتم إطلاق تشملك إلا بعد تحميل ActivereCord.

نصائح أخرى

هل أنت متأكد من أن هذا صحيح؟:

if defined?(ActiveRecord)

أفترض أنها خاطئة. بدلاً من "القضبان" ، حاول أن تتطلب "القضبان/كلها" - الأول لا يتم تحميل AR.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top