Pregunta

Realmente podría usar otro par de ojos en esto, así que pensé que iba a publicar aquí. Hace un tiempo escribí una extensión ActiveRecord básico para mis propios fines educativos. He estado leyendo sobre railties últimamente y pensé que iba a tratar de conseguir que funcione con Rails 3. pensé que iba a empaquetarlo como una joya para tener una idea de ese proceso también. Si me salto la Railtie y sólo hago esto como un monkeypatch tradicional en los inicializadores carpeta que trabaja muy bien. El uso de un Railtie ... nada.

Desde el aspecto de que mi Railtie nunca se ejecuta y por lo tanto nada parece estar sucediendo.

¿Alguien ve algo mal aquí?

¿Alguna sugerencia para las mejores prácticas o mejoras también son bienvenidos.

Proyecto 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
¿Fue útil?

Solución

Parece que ya tienes resolvieran esto, pero recuerde que con Rails 3 que puede hacer:

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

Esto va a asegurar que las necesidades de inclusión sólo se activa una vez que se ha cargado ActiveRecord.

Otros consejos

¿Estás seguro de que esto es verdad:?

if defined?(ActiveRecord)

supongo que es falsa. En lugar de "carriles" tratar de requerir "rieles / all" -. El primero no se está cargando AR

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top