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
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top