ActiveRecord :: Базовое расширение не работает - PullRequest
0 голосов
/ 05 февраля 2011

Я пытаюсь использовать приведенный ниже код для расширения активной записи, чтобы мой класс заказов был немного чище.Однако он не работает.

class ActiveRecord::Base   
  def self.has_statuses(*status_names)
    validates :status, 
              :presence => true, 
              :inclusion => { :in => status_names} 

    status_names.each do |status_name|
      scope "all_#{status_name}", where(:status => status_name)
    end

    status_names.each do |status_name|
      define_method "#{status_name}?" do
         status == status_name
      end
    end  
  end
end 

В environment.rb мне требуется указанное выше расширение с

require "#{Rails.root}/lib/active_record_extensions.rb" 

Если я, с другой стороны, создаю абстрактный базовый класс OrderBase и давайте мой заказкласс наследует от этого, вместо этого он работает как ожидалось.Что мне нужно сделать, чтобы мой патч обезьяны "взял"?

РЕДАКТИРОВАТЬ: забыл упомянуть, что я получил сообщение о том, что метод has_statuses отсутствует.

EDIT2: Приведенный выше код работает в консоли (rails c), но не работает в тесте

EDIT3: Я изменил среду / тест.rb в config.cache_classes = false, и это, кажется, делает свое дело.Очевидно, есть чему поучиться:)

Ответы [ 2 ]

0 голосов
/ 09 марта 2011

Я добавил требование в начало класса моего заказа

require "#{Rails.root}/lib/active_record_extensions.rb"
class Order < ActiveRecord::Base
0 голосов
/ 05 февраля 2011

Где вы храните этот код расширения? Я обнаружил, что расширения для важных классов Rails не работают из каталога «config / initializers /» (где я предпочел бы хранить их, для удобства), но работают, если я добавляю код расширения на конец "config / environment.rb" (который мне совсем не нравится, потому что он очень быстро запутывается). Я так и не понял почему.

Я на Rails 2.3.8, так что если вы на Rails 3, это может больше не применяться ...

EDIT:

Я забыл другой прием, который потребовался, чтобы заставить работать расширение ActiveRecord::Base - методы (методы класса, по крайней мере - я не сделал это с методом экземпляра) должны быть объявлены в метаклассе 1011 * (думаю, так оно и называется ...). Вот мое рабочее расширение ActiveRecord::Base:

ActiveRecord::Base.class_eval do
    class << self
        def find_with_benchmark(*args)
            bg = Time.now
            ret = find_without_benchmark(*args)
            MyLogger.ar_time += Time.now - bg
            MyLogger.ar_count += 1
            return ret
        end

        alias_method_chain :find, :benchmark
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...