2017-05-21 1 views
0

Ich habe auf Schienen Vererbung über Rubin gesucht, aber alles, was ich Vererbung finden konnte, wo keine neuen Attribute gibt es, wie folgt aus:Vererbung von Ruby on Rails mit neuen Attributen?

class Animal < ActiveRecord::Base; end 
class Dog < Animal; end 
class Cat < Animal; end 

und das Hinzufügen eines neuen Feld

class CreateAnimals < ActiveRecord::Migration 
    def self.up 
    create_table :animals do |t| 
     t.string :name 
     t.string :race 
     t.string :type 
    end 
    end 
end 
auf den Tisch

Aber wie füge ich Dog beispielsweise ein neues Attribut hinzu? like, Hunde haben einen 'Namen' und eine 'Rasse' von Tier geerbt, aber wie füge ich 'bark_type' hinzu, das nur ein Hund hat?

Antwort

3

Ich glaube, was Sie suchen, ist Single-Table Vererbung (STI). Grundsätzlich haben Sie eine einzige Tabelle in der Datenbank namens Haustiere, die alle erforderlichen Attribute (einschließlich derer für Unterklassen) hat und Sie haben eine "Typ" -Spalte, die no-null sein sollte und deren Spalte Sie die Unterklasse "Hund" speichern "

es ist ein gutes Beispiel, das ein Haustier, Hunde und Katzen Beispiel hat here

Beispiel

DogsController < Application

def new 
    @dog = Dog.new 
    end 

    def create 
    @dog = Dog.new(dog_params) 
    if @dog.save 
    ... 
    end 
    end 

private 

    def dog_params 
    params.require(:dog).permit(:name, :age) 
    end 
end 

Wichtig

Durch den Aufruf Dog.new statt Pet.new ist wie gesagt zu Active dies ist ein neuer Rekord für die Pet-Tabelle und in der Spalte „Typ“ fügen Sie die Zeichenfolge „Hund“

Hinweis 2: Wenn Sie Katzen Modell Ich möchte nicht speichern: Alter Parameter, Sie haben kein Altersfeld in Ihrem Formular. ABER weil für Hunde Sie auch das Alter wünschen, sollte der Haustier-Tisch eine Alterspalte haben, die vom Hundmodell

+0

yep verwendet wird, es ist STI, ich bin nur nicht sicher darüber, wie es auf Schienen tut. Ich würde einen Controller für Hund und einen für Katze haben, die auf dem Haustiertisch speichert? Wie würde ich das tun? Das von Ihnen verlinkte Beispiel hat keine neuen Attribute in den Kategorien Hund/Katze – xSlok

+0

Bitte lesen Sie den Link, den ich sorgfältig angegeben habe. Wie gesagt, alle Attribute von Katze oder Hund müssen Spalten auf dem Haustiertisch sein. Die Typspalte der Pet-Tabelle wird die Unterklasse aufweisen, z. B. "Hund". Ich werde meine Antwort mit einem kleinen Beispiel aktualisieren –