2012-10-14 7 views
8

Załóżmy, że mam model Doctor i model Patient. A Patient belongs_to a Doctor.Co to jest "szyny", aby uzyskać dostęp do atrybutów obiektu nadrzędnego?

A Doctor ma atrybut office.

Chciałbym, biorąc pod uwagę Patient p, móc powiedzieć p.office i uzyskać dostęp do office z Doktor p.

zawsze mogłem napisać metodę

class Patient 
    belongs_to :doctor 
    def office 
     self.doctor.office 
    end 

Ale jest tam bardziej automatyczny sposób, aby odsłonić wszystkie metody przypisują Doctor „s do Patient? Być może używając method_missing, aby mieć jakąś metodę catch-all?

Odpowiedz

8

Można użyć delegate.

class Patient 
    belongs_to :doctor 
    delegate :office, :to => :doctor 
end 

Możesz mieć wiele atrybutów w jednej metodzie delegatów.

class Patient 
    belongs_to :doctor 
    delegate :office, :address, :to => :doctor 
end 
+0

Co więc, jeśli oprócz "biura", miałem 10 innych atrybutów, które chciałem "przekazać" do "lekarza"? Czy muszę napisać 10 oświadczeń "delegata"? – Tim

+0

@Tim Możesz napisać tylko jeden. – xdazz

+0

Rozumiem, nie czytałem uważnie i zdałem sobie sprawę, że możesz przekazać wiele pól do przekazania. DZIĘKI! – Tim

2

Sądzę, że mówisz o używaniu Pacjenta jako delegata doktora.

class Patient < ActiveRecord::Base 
    belong_to :doctor 

    delegate :office, :some_other_attribute, :to => :doctor 
end 

myślę, że to byłby sposób method_missing w ten sposób:

def method_missing(method, *args) 
    return doctor.send(method,*args) if doctor.respond_to?(method) 
    super 
end 
Powiązane problemy