2010-06-12 20 views
12

Mam metodę klasy mieszane do wszystkich moich modeli. metoda zostanie wywołana podczas oceny klasy modelu. niestety (dla mnie), to wydaje się być na żądanie, ilekroć model jest potrzebny w rozwoju env. w jaki sposób szyny mogą ładować wszystkie modele podczas uruchamiania? czy to jest nawet wskazane?Szyny 3 ładowanie wszystkich modeli przy uruchomieniu

class Foo < ActiveRecord::Base 
    include Acl 
    register_acl # i need this to be called for all models at start up 
end 

Zasadniczo register_acl pobiera kilka argumentów "działań", które model chciałby mieć kontrolowany dostęp. Załóżmy, że jedną z akcji Foo jest "zarządzanie", a system musi być świadomy tej akcji podczas uruchamiania. Myślę, że w modelu jest najbardziej naturalne miejsce na tę logikę.

dziękuję!

Odpowiedz

18

poprawny sposób, aby to zrobić aplikacja szerokości jest włączenie cache_classes w danej konfiguracji. Domyślnie jest wyłączony w fazie rozwoju, ale w produkcji.

Jeśli chcesz to robić sporadycznie:

Rails.application.eager_load! 
+1

cache_classes jest bardzo niewygodne w rozwoju. Spróbuję metody eaglar_load! dzięki! – janechii

0

W modelach koncepcyjnych MVC nie działają samodzielnie, tzn. Powinny działać tylko wtedy, gdy kontroler wysyła im wiadomość (na przykład @ foo.register_acl). Modelowe instancje nawet nie powinny istnieć, dopóki nie zostaną utworzone przez kontroler.

Co próbujesz osiągnąć za pomocą metody register_acl?

Jeśli naprawdę potrzebujesz czegoś do wykonania przy tworzeniu obiektu, możesz użyć metody initialize(), która jest wywoływana za każdym razem, gdy tworzony jest obiekt Ruby.

Jeśli jednak potrzebujesz modelu do samodzielnego wykonania kodu, najprawdopodobniej masz do czynienia z pewnym zapachem kodu i musisz zmienić coś w swojej aplikacji.

+0

Dzięki za odpowiedzi! Zaktualizowałem moje pytanie, aby poinformować Cię, co próbuję zrobić. Nie próbuję tworzyć/pobierać wystąpień modelu. Po prostu potrzebuję pliku modelu do załadowania i oceny przez Rails przy starcie. W zwykłym programie ruby ​​można oczekiwać, że kod klasy zostanie oceniony podczas uruchamiania. Dzięki! – janechii

6

Nie wiem, czy to jest idealne, ale działa dla mnie. Gdzieś w config/zainicjować /, i to zrobić:

Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| require_dependency file } 

i że wstępnie załadować moje modele

+0

Nie można załadować modeli zagnieżdżonych lub modeli w zamontowanych silnikach, na przykład. Lepszym rozwiązaniem jest wywoływanie 'Rails.application.eager_load!', Jak sugerowała poprzednia odpowiedź. – dzajic

+0

Dzięki za wskazanie tego, @dzajic. To było na zawsze, ale najwyższy czas, aby odpowiedź została zmieniona na lepsze rozwiązanie! – janechii