2011-02-05 9 views
18

UPDATEJak korzystać z funkcji "after_initialize" w Rails 3?

ja błędnie sprawdził podręcznik edgerails zamiast obecnie poprawnych Rails 3 prowadzących (która nie ma wzmianki o after_initialize). Nie wiem, dlaczego przewodnik Edgerails jest "niepoprawny" - myślałem, że przewodnik po edgerachach powinien być najnowszym, aktualnym przewodnikiem?

Pozostawię to pytanie tak, jak na wypadek, gdyby ktoś szukał tego samego "problemu".

Wywołanie w stylu makro do after_initialize jest drogą do zrobienia.



Gdyby after_initialize być używany jako metoda lub makro stylu rozmowy?

To działa, ale daje ostrzeżenie Deprecation:

def after_initialize 
    logger.info "Called after_initialize" 
end 

Wycofanie UWAGA: Podstawa # after_initialize została zaniechana, skorzystaj Base.after_initialize: zamiast metody.

To działa, i nie ma ostrzeżenia:

after_initialize :do_this_after_initialize 
def do_this_after_initialize 
    logger.info "Called after_initialize" 
end 

Ale Active Record Walidacje i oddzwaniania przewodnik w 10.4 after_initialize and after_find mówi:

... Jeśli próbujesz zarejestrować after_initialize lub after_find przy użyciu metod klasy makr w stylu , będą po prostu zignorowane. Takie zachowanie jest ze względów wydajności, ponieważ after_initialize i after_find będzie zarówno miano dla każdego rekordu znaleźć w bazie danych, co znacznie spowalnia dół zapytań ...

Więc to oznacza, że ​​w makro- użycie stylu jest nieefektywne w porównaniu do metody stylu?

(Chyba przewodnik jest źle, „cos kod jest królem: D)


Kolejna aktualizacja


commit here od 28 stycznia 2011 roku, sugeruje, że w prawidłowy sposób nadal używać wywołania w stylu makro, a nie def after_initialize.

+3

Używam after_initialize na przykład do domów, położona skojarzeń. Przykład after_initialize: build_text,: unless =>: text. Bardzo pomocne przy korzystaniu z accepts_nested_attributes_for –

+0

Tutaj jest zaktualizowany link [do przewodnika Rails 4 o after_initialize] (http://guides.rubyonrails.org/active_record_callbacks.html#after-initialize-and-after-find) – stereoscott

Odpowiedz