2017-02-23 3 views
1

Ich versuche Rails zu lernen, und habe eine Frage, die mich ein wenig verwirrt. Ich habe zwei einfache Modelle: Media & MediaType.Was wäre in diesem Fall der richtige Rails-Modellverband?

Media hat Dinge wie: Titel, Produktionsdatum, Kosten, etc. Es hat auch ein "Typ" -Feld. Dies wäre ein Fremdschlüssel in der MediaType-Tabelle. MediaType ist einfach: ID, Name, aktiv (t/f).

Wenn ich darüber nachdenke, scheint Media has_one MediaType zu passen. Aber ich kann auch sehen, wie Media gehört zu MediaType und MediaType has_many Media auch passt. Von meinem POV brauche ich nur, dass die Media-Tabelle die ID speichert, die in die MediaTypes-Tabelle schaut. Die MediaTypes-Tabelle sollte nichts über Medien speichern, sodass ich auf "has_one" verweist.

Was ist richtig und was ist der Prozess, den jeder nutzt, um diese zu durchdenken?

Edit: für dieses Beispiel habe ich vor, dass Medien nur 1 Typ haben.

+0

Es hängt davon ab, was Sie unter Medien- und Medientyp verstehen. Sie sollten sich die Frage stellen: Kann ein Medientyp viele Medien haben? Oder kann es nur ein Medium haben? – the12

+0

oben erwähnt, lassen Sie es einfach bleiben. Medien können nur einen Typ haben. – mfisch

Antwort

1

Meine persönliche Empfehlung ist Medientyp-Modell zu verschrotten und es einfach als Feld/Spalte für das Medienmodell zu setzen. Es hat nur insgesamt zwei relevante Felder (Name und Typ), da Sie keine ID benötigen, da dies nur wirklich benötigt wird, um Medientypen unter der Annahme zu identifizieren, dass es eine eigene separate Tabelle ist. Sie würden nur unnötige Komplexität beseitigen (kann nur eine Datenbanktabelle gegen zwei haben). Eins-zu-eins-Beziehungen sind nur dann sinnvoll, wenn die Spalten für beide Tabellen zu groß sind, um in einer Tabelle gespeichert zu werden.

Wenn Sie unbedingt darauf schließen müssen, dann sollten folgende Arbeiten:

class Media < ActiveRecord::Base 
    belongs_to :media_type 
end 

class MediaType < ActiveRecord::Base 
    has_one :media 
end 

Beachten Sie, dass das Modell mit belongs_to derjenige sein wird, den Fremdschlüssel des anderen Modells zu speichern. In diesem Fall müssten Sie festlegen, dass Media eine mediaToys-Beziehung mit mediaType haben soll, da Media MediaTypes gespeichert werden soll. Das Schreiben von has_one: Medien für das Modell MediaType würde die Eins-zu-Eins-Beziehung vervollständigen.

In Ihren Migrationstabellen müssen Sie media_type_id in Ihre Migrationen im Medienmodell als Spalte einschließen, damit die Eins-zu-Eins-Beziehung gespeichert werden kann. Dann können Sie speichern, welche Medientypen in welche Medienaufzeichnungen gelangen.

+0

Dies ist eine großartige Erklärung der Optionen und warum dies gewählt wurde und mir helfen sollte, das nächste Mal, wenn ich eine Beziehung betrachten muss, zu verarbeiten, danke. Schnelle abschließende Frage, muss ich die Fremdschlüssel in meinen Migrationen manuell hinzufügen oder macht die Verbindung das für mich? – mfisch

+0

Rails behandelt die Singularform der association_ id als Fremdschlüssel. Wenn Sie in diesem Fall 'media_type_id' als Spalte in der Medien-Tabelle angegeben haben, wird die ID automatisch von' media_type' übernommen und als Fremdschlüssel in der Medien-Tabelle verwendet. Obwohl Rails 'media_type_id' als Fremdschlüssel behandelt, fügt es den Fremdschlüssel nicht wirklich der SQL-Tabelle hinzu. Sie müssen 'add_foreign_key' (Migrationsmethode) verwenden oder selbst tun. Weitere Informationen finden Sie unter http://guides.rubyonrails.org/active_record_migrations.html#foreign-keys. – the12

+0

Beachten Sie, dass die Verwendung von Fremdschlüsseln in Ihrer Datenbank in einer Rails-Anwendung nicht unbedingt erforderlich ist. Wenn Sie jedoch die Integrität zwischen Ihren Modellabfragen und SQL-Tabellen wünschen, können Sie sie, falls Sie möchten, hinzufügen. – the12

0

type ist nicht der gute Name für die Spalte, benennen Sie es in media_type_id um, wie durch andere Antwort hingewiesen.

Verwandte Themen