2010-05-17 12 views

Odpowiedz

0

W kontroli działania initialize, że klasa jest klasą bazową STI.

Chociaż pytanie brzmi, dlaczego dokładnie chcesz to zrobić? Wydaje się bardziej prawdopodobne, że wypróbowanie innego projektu może ci pomóc.

-4

Możesz zrobić self.abstract_class = true w klasie bazowej, aby powiedzieć ActiveRecord, że jest to klasa abstrakcyjna.

3

Można spróbować to:

class BaseClass 
    def initialize 
    raise "BaseClass cannot be initialized" if self.class == BaseClass 
    end 
end 

class ChildClass 
end 

wynik będzie:

a = BaseClass.new # Runtime Error 
b = ChildClass.new # Ok 

nadzieję, że pomoże

+1

Ponieważ klasa BaseClass prawdopodobnie będzie pochodzić z ActiveRecord :: Base, inicjalizacja powinna prawdopodobnie wywołać super. – Douglas

40

Odpowiedź Johna Topley jest rzeczywiście źle. Ustawienie klasy abstract_class = true w klasie bazowej spowoduje, że klasy potomne przestaną automatycznie ustawiać typ. Dodatkowo, jeśli nie ustawisz set_table_name w klasie bazowej, klasy dzieci będą narzekać, że ich tabela nie istnieje.

Dzieje się tak, ponieważ celem klasy abstract_class = true jest ustawienie dziedziczenia, gdy NIE używasz STI, i chcesz mieć klasę abstrakcyjną (klasa nieobsługiwana przez tabelę db) w hierarchii klas między ActiveRecord :: Base i jedną lub więcej klas modeli.

Po inicjowaniu podniesienia jest jednym rozwiązaniem, również dodanie validates_presence_of: type do klasy bazowej jest rozwiązaniem.

Uwaga Jeśli nie zastępują initialize, trzeba zadzwonić Super:

def initialize(*args) 
    raise "Cannot directly instantiate an AbstractUser" if self.class == AbstractUser 
    super 
end 
+0

Dlaczego ta odpowiedź nie jest u góry odpowiedzi? Znajduje się poniżej odpowiedzi z 0 głosów i drugą, która została usunięta. –

0

często wolą po prostu sprawiają, że metoda new klasa prywatny z:

class Base 
    private_class_method :new 
end 

ten sposób przypadkowego instancji z Klasa podstawowa uruchamia błąd, ale nadal można utworzyć instancję za pomocą Base.send(:new), aby pisać testy dla klasy Base.

Powiązane problemy