2011-02-05 3 views
0

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

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 и давайте мой класс заказа наследует от вместо этого он работает, как ожидался , Что мне нужно сделать, чтобы мой патч обезьяны «взял»?

EDIT: забыл упомянуть, что получил сообщение о том, что метод отсутствует для has_statuses.

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

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

+0

Это на самом деле работает для меня, как вы используете этот метод? – seeingidog

+0

Я пытаюсь использовать его в моем классе Order, например: has_statuses: created,: in_progress,: отправлено и т. Д., Чтобы сохранить класс в чистоте. – mhenrixon

+0

@seeingidog err теперь работает и для меня, и я понятия не имею, что другое ... Я, очевидно, что-то сделал, но не знаю, что. Отправьте ответ, говоря, что он должен работать, и я отмечу это как ответ! – mhenrixon

ответ

0

Я добавил требует, чтобы в верхней части моего заказа класса

require "#{Rails.root}/lib/active_record_extensions.rb" 
class Order < ActiveRecord::Base 
0

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

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

EDIT:

Я забыл другую уловку потребовалось, чтобы получить расширение ActiveRecord::Base - методы (методы класса, по крайней мере, я не делал это с помощью метода экземпляра) должны быть объявлены в метаклассе (я думаю, именно так оно и называется ...). Вот мой рабочий 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 
+0

спасибо, я также попытался включить код в конец environment.rb, но получить тот же результат. Метод отсутствует :( – mhenrixon

+0

@mhenrixon Oho! Подождите! Я забыл что-то еще, что мне нужно было сделать, чтобы получить расширение «ActiveRecord :: Base»! Я отвечу его на свой ответ - одна минута ... –

+0

пробовал свой путь от этого я столкнулся с проблемой, когда он жалуется на неожиданный \ n ожидаемый [или. Поэтому я предполагаю, что были некоторые изменения в том, как это работает. – mhenrixon

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