Rails :: Railtie: Ärger ein Rails 3 gem Schaffung
-
02-10-2019 - |
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
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