Добавление в ActiveRecord :: ConnectionAdapters :: MysqlAdapter - PullRequest
0 голосов
/ 05 марта 2010

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

/ 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

Может кто-нибудь объяснить, что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Просто наткнулся на это.

Вы не можете вызвать его изнутри base.class_eval и, очевидно, не можете поместить его в модуль ClassMethods (Поскольку в модуле ClassMethods нет метода select, есть ли?)

Путь должен сделать это:

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

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

0 голосов
/ 05 марта 2010

поместите свой 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
...