2010-03-04 47 views
0

对于一般知识和娱乐目的,我试图给Rails添加一些行为。我正在寻找的只是在Rails运行的每条选择语句之前运行Mysql“EXPLAIN”语句。我认为这应该可以,但我得到的错误:添加到ActiveRecord :: ConnectionAdapters :: MysqlAdapter

/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/module/aliasing.rb:32: in alias_method': undefined method select_with_explain'for class'ActiveRecord :: ConnectionAdapters :: MysqlAdapter'(NameError)

该类位于initializers dir中。这里是代码:

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 

有人可以解释我在这里失踪?

回答

0

将您的alias_method_chain放入您的ClassMethods模块中。因为你定义的方法类classMethod和别名一个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 
0

刚刚偶然发现了这一点。

你不能在base.class_eval之内调用它,你显然不能把它放在ClassMethods模块中。 (由于在ClassMethods模块没有select方法,是吗?)

要走的路是这样:

def self.included(base) 
    base.extend ClassMethods 
    class << base 
    alias_method_chain :select, :explain 
    end 
end 

你只需要通过一个鬼类那边来访问它。希望能帮助到你。

相关问题