Ich bin verwirrt darüber, wie man ein Modell generiert, das zu einem anderen Modell gehört. Mein Buch verwendet diese Syntax, um Micropost dem Benutzer zuzuordnen:
rails generate model Micropost user_id:integer
aber http://guides.rubyonrails.org/ sagt, es so zu machen:
rails generate model Micropost user:references
Die von diesen beiden generierten Migrationen sind unterschiedlich. Woher wissen Rails bei ersteren, dass user_id
es sich um eine Fremdschlüsselreferenzierung handelt user
? Vielen Dank!
quelle
Rails selbst weiß nicht, dass
user_id
es sich um eine Fremdschlüsselreferenzierung handeltuser
. Im ersten Befehlrails generate model Micropost user_id:integer
wird nur eine Spalteuser_id
hinzugefügt, Rails kennt jedoch die Verwendung der Spalte nicht. Sie müssen die Linie manuell in dasMicropost
Modell einfügendie Schlüsselwörter
belongs_to
undhas_many
bestimmen die Beziehung zwischen diesen Modellen und deklarierenuser_id
als Fremdschlüssel zumUser
Modell.Der spätere Befehl
rails generate model Micropost user:references
fügt die Zeilebelongs_to :user
in dasMicropost
Modell ein und deklariert hiermit als Fremdschlüssel.Zu Ihrer
Information Wenn Sie die Fremdschlüssel mit der vorherigen Methode deklarieren, werden die Rails nur über die Beziehung der Modelle / Tabellen informiert. Die Datenbank ist über die Beziehung unbekannt. Wenn Sie die EER-Diagramme mit einer Software wie der folgenden erstellen, stellen
MySql Workbench
Sie daher fest, dass zwischen den Modellen keine Beziehungsthreads gezogen werden. Wie im folgenden BildWenn Sie jedoch die spätere Methode verwenden, sieht Ihre Migrationsdatei folgendermaßen aus:
Jetzt wird der Fremdschlüssel auf Datenbankebene festgelegt. und Sie können geeignete
EER
Diagramme erstellen.quelle
add_foreign_key
Aktion durch eine Optionforeign_key: true
für diet.references
Linie ersetzt hat, was impliziertindex: true
. So ist es jetztt.references :user, foreign_key: true
. Derzeit ist keine Dokumentation für dieforeign_key
Option verfügbar, daher ist dies nur meine Annahme.add_reference
Aktion hat eine:foreign_key
Option, die eine entsprechende Fremdschlüsseleinschränkung hinzufügt . Ich denke, diese Option würde das gleiche tun, wenn eine Tabelle erstellt wird.add_foreign_key :microposts, :users
für Rails einen Unterschied?Für erstere Konvention über Konfiguration. Schienen standardmäßig, wenn Sie auf eine andere Tabelle verweisen
ist zu suchen
something_id
.references
, oderbelongs_to
ist eigentlich eine neuere Art, die erstere mit wenigen Macken zu schreiben.Es ist wichtig zu beachten, dass keine Fremdschlüssel für Sie erstellt werden. Dazu müssen Sie es explizit einrichten, indem Sie entweder Folgendes verwenden:
oder (beachten Sie den Plural):
quelle
:polymorphic
Option (was meiner Meinung nach in den meisten Fällen keine gute Idee ist). Wenn Sie Fremdschlüssel in ActiveRecord verwenden möchten, verwenden Sie Foreigner .add_foreign_key
hat es in ActiveRecord geschafft.