Carriles :: Railtie: problemas para crear una gema Rails 3
-
02-10-2019 - |
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
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