2009-08-03 15 views
14

Say Mam modelu użytkownika z następującego kodu w User.rb:Czy urządzenia wywołują wywołania zwrotne modelu?

before_create :create_dependencies 
after_create :build_inbox 

i mam również plik users.yml z grupą opraw zdefiniowanych przez użytkownika w nim.

Po uruchomieniu programu rake db: fixtures: load, wydaje się, że nie uruchamia on wywołań zwrotnych.

  1. Czy tak ma działać? Jeśli tak, dlaczego zaprojektowali go w ten sposób?
  2. Czy istnieje sposób na wymuszenie wywoływania wywołań zwrotnych podczas ładowania urządzeń?

Odpowiedz

20

Czy tak ma działać? Jeśli więc , dlaczego zaprojektowali go w ten sposób?

Tak, urządzenia nie używają połączeń zwrotnych. Zakładam, że to ze względu na wydajność. Szybsze jest ładowanie danych bezpośrednio do bazy danych bez tworzenia instancji modelu.

Czy istnieje sposób zmusić wyzwalania z wywołań zwrotnych podczas ładowania opraw?

Nie to, co wiem. Masz kilka opcji. Jedną z nich jest budowa urządzeń, tak jakby wywołania zwrotne zostały już uruchomione. Oznacza to, że ręcznie utworzą dane, które będą wywoływać wywołania zwrotne. Na przykład, jeśli masz wywołanie zwrotne, które miesza hasło użytkownika, musisz ręcznie wprowadzić hasło, a następnie zapisać je w urządzeniu.

Drugim rozwiązaniem (i wysoce zalecane!) Jest użycie fabryk. Fabryki powodują wywołania zwrotne i pozwalają używać atrybutów wirtualnych itp. Dzieje się tak dlatego, że za każdym razem tworzą instancję modelu. Popularnym klejnotem jest Factory Girl. Kolejną próbą jest Machinist. Stworzyłem także Railscasts episode na ten temat.

+0

Doskonale, dzięki. – cakeforcerberus

+0

+1 do dziewczyny z fabryki. Dołączyłem do niego około 2 miesięcy temu i nigdy nie oglądałem się za siebie. –

+0

+1, ponieważ Factory Girl jest niesamowita ... poświęć godzinę, aby się tego nauczyć, bardzo szybko nadrobisz stracony czas. – Emerson

4

Mam również ten problem. Nasza aplikacja oblicza niektóre sumy before_save, więc nie trzeba tego robić w locie. Sprawia, że ​​raportowanie jest szybsze i eliminuje kilka połączeń w niektórych raportach.

W testach dla tych obiektów możemy ręcznie uruchomić zwrotnych jak to:

before do 
    order.perform_callbacks 
end 

Działa to dobrze działało, ponieważ nie działa cały czas, więc inne testy nie cierpią.

Używamy minitestu i urządzeń btw.

+0

Gdzie ten kod się znajduje? Początek urządzenia? Czym jest porządek? – hellion

+0

Cześć piekło. Kod znajduje się na górze mojego pliku testowego w poprzedniej wersji, ponieważ w tym przypadku potrzebuję go do każdego testu w tym pliku. Jeśli potrzebujesz tylko uruchomić wywołania zwrotne dla 1 testu, możesz po prostu wstawić .perform_callbacks w tym konkretnym teście. – jacklin

+0

Co to jest "order", klasa, instancja? To dziwne, że nie mogę znaleźć 'perform_callbacks' udokumentowanych gdziekolwiek. –

Powiązane problemy