2009-09-30 11 views
16

ActiveRecord ma kilka różnych metod wywoływania zwrotnego używanych w celu uproszczenia logiki modelu. Na przykład metody after_find i before_create.Dlaczego wywołania zwrotne ActiveRecord wymagają, aby zmienne instancji lub metody instancji były poprzedzone słowem kluczowym self?

Rozważmy następujący przykład kodu:

class ExternalPrintingCard < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :ph_user 

    after_create :change_pin 

    def change_pin 
    self.user.randomize_printer_pin 
    end 

    def after_find 
    return if self.card_status == false 
    self.card_status = false if self.is_used_up? 
    self.card_status = false if self.is_expired? 
    self.save! 
    end 
end 

Jeśli usunąć wszystkie self prefiksy od zmiennych instancji lub metod instancji, te 2 Funkcje będą nazwie, ale to tak jakby oni są zmienne lokalne wewnątrz tych zwrotnego metody.

Instancja zmienna (card_status), sposoby, przykładowo (save!, is_used_up? i is_expired?) i asocjacji (user) pracowała prawidłowo poza tymi 2 metody zwrotnych bez przedrostka self.

Przykładowy kod w dokumentacji Railsów dla metod wywołania zwrotnego (metody instancji) wydaje się zawsze używać prefiksu self, mimo że wywołuje on zmienne lub metody instancji, które normalnie są dostępne bez prefiksu self.

Mam nadzieję, że ktoś, kto lepiej zrozumie wywołania zwrotne ActiveRecord, może pomóc rzucić światło na to zachowanie.

Cheers

Odpowiedz

14

Technicznie trzeba tylko użyć siebie przed metod przydziału. Jest to konieczne, aby odróżnić metodę instancji od trailing = i przypisania do zmiennej lokalnej.

+5

Zobacz ten artykuł Thoughtbot dla wielu szczegółów: http://robots.thoughtbot.com/post/185504560/to-self-or-not-to -self –

+0

inny artykuł, który wyjaśnia to http: //www.rubyfleebie. com/use-self-explicitly / –

1

Nasmorn jest poprawny.

ActiveRecord :: Base umieścił wszystkie nazwy kolumn wewnątrz zmiennej instancji @attributes (Hash) i utworzył metody instancji akcesorów dla tych nazw kolumn.

Na przykład:

card_status jest kolumną w external_printing_cards tabeli, będzie musiał metody dostępowe z nazwą card_status i card_status=

Od rubin zmienna lokalna definicja jest dynamiczna linia

def after_find 
    .... 
    card_status = false if self.is_used_up? 
    .... 
end 

będzie oznaczać definiowanie i przypisywanie zmiennej lokalnej card_status zamiast metody instancji card_status=

Artykuł opublikowany przez Peer Allan zawiera dodatkowe wyjaśnienia.

Powiązane problemy