我真的可以在此上使用另一套眼睛,所以我想我会在这里发布。不久前,我出于自己的教育目的写了基本的ActivereCord扩展。我最近一直在阅读有关Railties的信息,并认为我会尝试与Rails 3一起工作3。我认为我也将其包装为一颗宝石,以了解该过程。如果我跳过轨道,只是在初始化文件夹中作为传统的猴子捕捞来做到这一点,则可以正常工作。使用铁路...什么都没有。

从外观上看,我的铁路从未被执行,因此似乎没有其他事情发生。

有人在这里看到什么错误吗?

欢迎对最佳实践或改进的任何建议。

Project 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
有帮助吗?

解决方案

看起来您已经解决了,但是请记住,使用Rails 3您可以做:

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

这将确保只有在加载ActivereCord后才将您的包含释放。

其他提示

您确定这是真的吗?

if defined?(ActiveRecord)

我想这是错误的。而不是“导轨”尝试“轨道/all”,第一个没有加载AR。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top