Rails :: Railtie: difficulté à créer un Rails 3 bijou
-
02-10-2019 - |
Question
Je pourrais vraiment utiliser une autre paire d'yeux sur ce que je pensais que je posterais ici. Il y a quelque temps je l'ai écrit un ActiveRecord de base Extension pour mes propres fins éducatives. J'ai lu à propos de ces derniers temps et Railties pensé que je voudrais essayer de le faire fonctionner avec Rails 3. Je pensais que je l'emballer comme un petit bijou pour avoir une idée de ce processus. Si je saute le Railtie et juste faire cela comme un classique dans le monkey-patch dossier initializers il fonctionne très bien. L'utilisation d'un Railtie ... rien.
De l'apparence de celui-ci mon Railtie est jamais exécuté et donc rien d'autre semble se produire.
Quelqu'un voit-il quelque chose de mal ici?
Toutes les suggestions sur les meilleures pratiques ou des améliorations sont également les bienvenus.
Projet 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
La solution
On dirait que vous avez déjà ce triée, mais rappelez-vous que Rails 3 que vous pouvez faire:
ActiveSupport.on_load :active_record do
ActiveRecord::ConnectionAdapters::MysqlAdapter.include SqlExplain::AR
end
Cela va faire en sorte que include ne sera tiré une fois ActiveRecord a été chargé.
Autres conseils
Êtes-vous sûr cela est vrai:?
if defined?(ActiveRecord)
Je suppose qu'il est faux. Au lieu de « rails » essayer d'exiger « rails / all. » - le premier ne se charge pas AR