Utrata metody dodawanej za pomocą engine, tylko development

Witam, mam engine który dodaje metody do modelu User w ten sposób

# engine.rb 

module Badges
  class Engine < ::Rails::Engine

  initializer :add_methods_for_badge_conditions do
    User.activated_badges.each do |badge_name|
      User.send :include, "Badges::#{badge_name.to_s.camelcase}".constantize
    end
  end

przykładowy moduł z metodą która ma być dodana:

module Badges::Badges::Biographer

def deserves_biographer_badge?
   !self.bio.blank?
end

end

Na produkcji wszystko działa ok, na test także, ale na development od czasu do czasu dostaje komunikat że dana metoda jest niezdefiniowana. Po restarcie serwera wszystko działa normalnie. Podejrzewam że może chodzić o to że na produkcji klasy są cachowane a na development przy każdym requeście ładowane od nowa ?

No… nie. Zauważ, że User.activated_badges zwróci ci listę odznak. Dodajesz je w initializerze, więc tylko przy starcie serwera.

Następnie dodajesz jakaś odznakę (klasę) podczas gdy serwer na dev dalej chodzi. Ta odznaka nie dołączy już swoich metod z klasy, bo initializer już się wykonał i dlatego tylko restart pomaga. Według mnie źle do tego podchodzisz.

Co oznacza User.activated_badges? Nie lepiej dodać wszystkie Badges::XXX do modułu Badges::All i dołączać to bezpośrednio poprzez w samym modelu?

module Badges
  module All
    include 'A'
    include 'B'
  end
end

i w user.rb

class User
  include Badges::All
end

W ten sposób masz pewność, że zawsze klasa będzie dobrze przeładowana.

User activated badges zwraca liste i ona sie nie zmienia zbyt często.
Ustawiane to jest w modelu User aplikacji gdzie engine jest użyty:

include Badges::UserConcern
badges :badge1, :badge2 etc...

Wydaje mi sie że błąd występuje tylko gdy używam zdalnego repozytorium, gdy ładuje engine lokalnie jest ok. Ale czasem ze zdalnego także działa, ciężko tu o prawidłowość