Ruby on rails 添加到ActiveRecord::ConnectionAdapters::MysqlAdapter

Ruby on rails 添加到ActiveRecord::ConnectionAdapters::MysqlAdapter,ruby-on-rails,ruby-on-rails-plugins,Ruby On Rails,Ruby On Rails Plugins,出于一般知识和娱乐目的,我尝试向Rails添加一些行为。我想要的只是在Rails运行的每个select语句之前运行一个Mysql“EXPLAIN”语句。我认为这应该可以,但我得到了错误: /usr/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active\u-support/core\u ext/module/aliasing.rb:32:inalias\u方法:未定义的方法 此类位于初始值设定项目录中。代码如下: module Expl

出于一般知识和娱乐目的,我尝试向Rails添加一些行为。我想要的只是在Rails运行的每个select语句之前运行一个Mysql“EXPLAIN”语句。我认为这应该可以,但我得到了错误:

/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active\u-support/core\u ext/module/aliasing.rb:32:in
alias\u方法:未定义的方法

此类位于初始值设定项目录中。代码如下:

    module Explanifier

      def self.included(base)

        base.class_eval do
          extend ClassMethods
          alias_method_chain :select, :explain


        end
      end
      module ClassMethods
        def select_with_explain(sql, name = nil)
          puts "testing!!!"
          execute('EXPLAIN ' + sql, name)
          select_without_explain(sql, name)
        end
      end

    end



    class ActiveRecord::ConnectionAdapters::MysqlAdapter
      include Explanifier
    end

有人能解释一下我在这里遗漏了什么吗?

将别名\u方法\u链放入ClassMethods模块中。因为您像classMethod和alias一样定义了InstanceMethod


    module Explanifier

      def self.included(base)

        base.class_eval do
          extend ClassMethods



        end
      end
      module ClassMethods
        def select_with_explain(sql, name = nil)
          puts "testing!!!"
          execute('EXPLAIN ' + sql, name)
          select_without_explain(sql, name)
        end
        alias_method_chain :select, :explain
      end

    end

只是偶然发现了这个

您不能从
base.class\u eval
中调用它,显然也不能将它放入
ClassMethods
模块中。(由于
ClassMethods
模块中没有
select
方法,是否存在?)

方法是这样做:

def self.included(base)
  base.extend ClassMethods
  class << base
    alias_method_chain :select, :explain
  end
end
def自带(基本)
base.extend类方法
班