2010-03-04 1 views
0

Для общих знаний и развлечений я пытаюсь добавить некоторые поведенческие требования к Rails. Я ищу просто запустить оператор Mysql «EXPLAIN» перед каждым оператором select, который запускает Rails. Я думаю, что это должно работать нормально, но я получаю ошибку:Добавление в ActiveRecord :: ConnectionAdapters :: MysqlAdapter

/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/module/aliasing.rb:32: в alias_method': undefined method select_with_explain 'для класса `ActiveRecord :: ConnectionAdapters :: MysqlAdapter' (NameError)

Этот класс находится в директории инициализаторов. Вот код:

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. (Так как нет select метод в ClassMethods модуле есть?)

путь это сделать:

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

Вам просто нужно получить к нему доступ через класс призрак там. Надеюсь, поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^