代码之家  ›  专栏  ›  技术社区  ›  mikewilliamson

添加到ActiveRecord::ConnectionAdapters::MysqlAdapter

  •  0
  • mikewilliamson  · 技术社区  · 16 年前

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

    alias_method': undefined method

    此类位于initializers目录中。代码如下:

        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
    

    2 回复  |  直到 16 年前
        1
  •  0
  •   shingara    16 年前

    将别名\方法\链放入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
    
        2
  •  0
  •   alg    15 年前

    只是偶然发现了这个。

    base.class_eval 显然你不能把它放在 ClassMethods 模块(既然没有 select 中的方法 模块,有吗?)

    方法是:

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

    你只需要通过那边的鬼类就可以了。希望有帮助。

    推荐文章