2010-09-13 76 views
4

我真的可以使用另一组眼睛,所以我想我会在这里发布它。 前段时间,我为自己的教育目的编写了一个基本的ActiveRecord扩展。我最近一直在阅读关于Railties的文章,并认为我会试着让它与Rails 3一起工作。我想我会把它打包成一个宝石,以便了解这个过程。 如果我跳过Railtie,并且只是将它作为初始化文件夹中的传统monkeypatch,那么它工作正常。使用Railtie ...什么也不是。Rails :: Railtie:麻烦创建一个Rails 3宝石

从外观上看,我的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 2010-09-27 17:07:02

+0

没有什么会弹出来,因为它是错的。你确定Railtie本身正在加载吗? – PreciousBodilyFluids 2010-09-27 17:22:49

+0

railtie是。 Railtie内部的ActiveSupport.onload可以毫无麻烦地工作。初始化块内的任何内容都不会触发。文档使它看起来像是被自动调用... – mikewilliamson 2010-09-28 18:57:21

1

你确定这是真的?:

if defined?(ActiveRecord) 

我想这是假的。而不是“铁轨”试图要求“铁轨/全部” - 第一个不加载AR。

+0

感谢gertas,我又看了一遍这个要求,我想我现在做的是正确的事情......也许。 – mikewilliamson 2010-09-21 03:07:19