Frage

Ich konnte wirklich einen anderen Satz von Augen auf diese verwenden, so dachte ich, ich es hier posten würde. Vor einiger Zeit schrieb ich eine grundlegende Active Erweiterung für meine eigenen pädagogischen Zwecke. Ich habe in letzter Zeit über Railties gelesen und dachte, ich würde versuchen, es mit Rails arbeiten zu bekommen 3. Ich dachte, dass ich es packen würde als ein Juwel auf ein Gefühl dieses Prozesses sowie zu bekommen. Wenn ich die Railtie überspringen und tun dies nur als traditionelles monkeypatch in den initializers Ordner es funktioniert gut. Mit einem Railtie ... nichts.

Von den Blicken von ihm meine Railtie nie ausgeführt wird, und daher scheint nichts anderes geschehen.

Hat jemand Sehen Sie alles falsch hier?

Alle Vorschläge für Best Practices und Verbesserungen sind auch willkommen.

Projekt 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
War es hilfreich?

Lösung

Sieht aus wie du schon hast diese aussortiert, aber denken Sie daran, dass mit Rails 3 können Sie tun:

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

Das wird sicherstellen, dass Ihr gehören wird nur ausgelöst werden, wenn Active geladen wurde.

Andere Tipps

Sind Sie sicher, dass dies wahr ist:

if defined?(ActiveRecord)

Ich nehme an, es ist falsch. Statt „Schienen“ versuchen zu verlangen „Schienen / all.“ - das erste ist nicht AR Laden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top