2010-09-13 2 views
4

Я мог бы использовать еще один набор глаз, поэтому я подумал, что отправлю его здесь. Некоторое время назад я написал базовое расширение ActiveRecord для своих собственных образовательных целей. В последнее время я читал о железных дорогах и думал, что попытаюсь заставить его работать с Rails 3. Я думал, что упакую его как драгоценный камень, чтобы понять этот процесс. Если я пропущу Railtie и просто сделаю это как традиционный monkeypatch в папке инициализаций, он отлично работает. Использование Railtie ... ничего.Rails :: Railtie: проблема с созданием Rails 3 gem

Из-за внешнего вида мой Railtie никогда не исполнялся, и поэтому ничего другого, похоже, не происходит.

У вас есть ошибки?

Любые предложения по передовым практикам или улучшениям также приветствуются.

проект 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 

ответ

3

Похоже, вы уже получили это выяснял, но помните, что с Rails 3 вы можете сделать:

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

Это будет гарантировать, что ваш включать уволят только один раз был загружен ActiveRecord.

+0

Я никогда не мог получить способ инициализации, чтобы стрелять в мою railtie. Какие-нибудь советы по этому поводу? – mikewilliamson

+0

Ничто не выскакивает на меня как ошибочное. Вы уверены, что сам Рейли загружается? – PreciousBodilyFluids

+0

Рейтинги есть. ActiveSupport.onload внутри railtie работает без проблем. Все, что внутри блока инициализатора никогда не срабатывает. Документы показывают, что это просто вызвано автоматически ... – mikewilliamson

1

Вы уверены, что это правда ?:

if defined?(ActiveRecord) 

Я полагаю, что это неверно. Вместо «рельсов» попробуйте потребовать «рельсы/все» - первый не загружает AR.

+0

Спасибо, gertas, я еще раз посмотрел на требования, и я думаю, что теперь он делает правильные вещи ... может быть. – mikewilliamson

Смежные вопросы