6

sagen, wenn wir ein ModellWenn wir in Ruby on Rails ein Modell "Animal" generiert haben und nun "Dog" haben wollen, wie sollen wir das machen?

rails generate model animal name:string birthday:date 

und jetzt haben wir einen anderen Modell erstellen möchten von ihm (wie Hund und Katze) zu erben, sollten wir rails generate model wieder verwenden oder fügen Sie einfach die Dateien selbst? Wie geben wir an, dass Hund von Tier erben soll, wenn wir rails generate model verwenden?

Ich denke, wenn wir rails generate model verwenden, anstatt die Modelldateien selbst hinzuzufügen, wird es Unit-Testdateien und Fixture-Dateien auch für uns erstellt. Eine Migrationsdatei wird ebenfalls hinzugefügt, außer wenn sie MongoDB verwendet. Dann gibt es keine Migrationsdatei.

Antwort

2

Soweit ich weiß, können Sie beim Generieren eines Modells keine Oberklasse angeben. Generatoren sind jedoch nur ein Sprungbrett zum Erstellen Ihrer Klassen. Sie können die Modellklasse als normal generieren und einfach die Superklasse in der generierten Modelldatei ändern. Es gibt keine anderen Orte, an denen die Vererbungsbeziehung spezifiziert werden muss, damit die generierten Dateien funktionieren (die Fixtures und Unit Tests zum Beispiel spezifizieren keine Super- oder Subklassen).

So:

script/generate model Dog 

Dann ändern:

class Dog < ActiveRecord::Base 

zu:

class Dog < Animal 

Wenn Sie ein Modell erstellt werden soll, die dann von Tier unter Verwendung von Single-Table Erbe erben Sie Möglicherweise möchten Sie --skip-migrations für das Script/generate call angeben (obwohl Sie eine Migration hinzufügen möchten, z. B. Hundespezifische Spalten zu den Tieren Tabelle und Sie müssen eine type Spalte des Typs String in die Tiere Tabelle hinzufügen).

+2

Dies muss einen String Spalte na med 'type', um in' Animal' präsent zu sein. – Swanand

+0

Guter Anruf, aktualisiert. – Shadwell

7

Wenn die Dog, Cat und andere Subklassen Sie planen, sind nicht weg zu divergieren von Animal Modell können Sie STI (Single Table Inheritance) Muster hier.

Fügen Sie dazu eine String Spalte zu Animal hinzu. Und dann können Sie haben:

class Dog < Animal 
end 

class Cat < Animal 
end 

>> scooby = Dog.create(:name => 'Scooby', :date => scoobys_birthdate) 
=> #<Dog id: 42, date: "YYYY-MM-DD", type: "Dog"> 

Modell Dog

$ script/generate model Dog --skip-migration 

zu erzeugen und dann (in der Regel app/models/dog.rb) ändern:

class Dog < ActiveRecord::Base 

zu

class Dog < Animal 
+0

ich sehe ... wie wäre es, wenn es zusätzliche Eigenschaft mit dieser Klasse, wie zum Beispiel 'fur_color: string'? Wie wirkt es sich auf das 'Generieren' und die Tabellen aus? –

+0

Wenn Sie eine neue Spalte hinzufügen, sagen Sie 'fur_color', wie Sie sagen, wird es für alle Unterklassen verfügbar sein. Es macht vielleicht immer keinen Sinn, z. Sie haben 'Klasse Snake Swanand

+4

Sie können die Oberklasse beim Erstellen eines Modells definieren, indem Sie ein Flag "--parent" angeben. Siehe [diese] (http://stackoverflow.com/a/14569424) Post. Aus dem, was ich beobachtet habe, werden auch keine Migrationen generiert. –

Verwandte Themen