2009-03-28 19 views
1

Wie funktionieren die Beziehungen auf magische Weise, wenn nur die Modelle geändert werden?Rails ActiveRecord-Beziehungen

Wenn ich eine "has__and___belongs___to__many" Beziehung haben möchte, was soll ich die Tabelle nennen (damit Rails sie verwenden kann), die die zwei Fremdschlüssel enthält?

Antwort

2

Kurze Antwort: Sie können den Modellen nicht sagen, dass sie verwandt sind; dazu muss es auch Spalten in der Datenbank geben.

Wenn Sie verwandte Modelle einrichten, geht Rails davon aus, dass Sie einer Konvention gefolgt sind, die es ermöglicht, die Dinge zu finden, die Sie geschrieben haben. Hier ist, was passiert:

  1. Sie richten die Tabellen ein.

    Nach den Konventionen in Rails benennen Sie die Tabelle in einer bestimmten, vorhersagbaren Weise (ein Plural Substantiv, z. B. people). Wenn Sie in dieser Tabelle eine Beziehung zu einer anderen Tabelle haben, müssen Sie diese Spalte erstellen und sie auf eine andere vorhersagbare Weise benennen (z. B. bank_account_id, wenn Sie sich auf die Tabelle bank_accounts beziehen).

  2. Sie schreiben eine Modellklasse von Active vererben :: Base

    class Person < ActiveRecord::Base

    Wenn Sie eines dieser Modelle instanziiert, die Activerecord :: Base Konstruktor im Namen der Klasse aussieht, wandelt es in Kleinbuchstaben und pluralisiert es. Hier gibt Personpeople aus, den Namen der Tabelle, die wir zuvor erstellt haben. Jetzt weiß ActiveRecord, wo alle Informationen über eine Person zu erhalten sind, und kann die SQL-Ausgabe lesen, um herauszufinden, was die Spalten sind.

  3. Sie fügen dem Modell Beziehungen hinzu: has_many, belongs_to oder has_one.

    Wenn Sie geben etwas wie has_many :bank_accounts, es ein paar Dinge übernimmt:

    1. Der Name des Modells, das Sie Bankaccount, ist beziehen (von Kamel-Gehäuse :bank_accounts).

    2. Der Name der Spalte in der Tabelle people, die sich auf ein Bankkonto bezieht, lautet bank_account_id (aus der Singularisierung :bank_accounts).

    3. Da die Beziehung has_many ist, weiß ActiveRecord Ihnen Methoden wie john.bank_accounts zu geben, die Pluralnamen für Dinge verwenden.

zusammen all das Einlochen, weiß Active wie SQL-Abfragen zu machen, dass Sie eine Person, die Bankkonten geben. Es weiß, wo alles zu finden ist, weil Sie eine Namenskonvention befolgt haben, die es versteht, als Sie die Tabelle und ihre Spalten erstellt haben.

Eines der schönen Dinge über Ruby ist, dass Sie Methoden für eine ganze Klasse ausführen können, und diese Methoden können andere Methoden zu einer Klasse hinzufügen. Genau das tun has_many und Freunde.

+0

Wenn ich also eine "has_and_belongs_to_many" -Beziehung haben möchte, wie soll ich die Tabelle benennen (damit Rails sie verwenden kann), die die zwei Fremdschlüssel enthält? – GeekJock

+0

Die Dokumentation ist eine große Ressource hierfür: http://tinyurl.com/cnfm24 Um zu paraphrasieren, ist die Konvention für die Join-Tabelle die Mehrzahl von jedem, in lexikalischer Reihenfolge. Für Master- und Pet-Modelle würden wir die Tabelle 'master_pets' erstellen. Die Spalten sollten 'master_id' und' pet_id' sein. –

+0

Danke, das habe ich gesucht. – GeekJock

2

Dies funktioniert, weil Sie "Convention over Configuration" folgen.

Wenn Sie angeben, dass ein Kundenmodell viele Aufträge hat, erwartet rails, dass in der Auftragstabelle ein customer_id-Feld vorhanden ist.

Wenn Sie diesen Konventionen gefolgt sind, dann werden Rails diese verwenden und in der Lage sein, die notwendige SQL zu erstellen, um alle Bestellungen für einen bestimmten Kunden zu finden.

Wenn Sie sich die Entwicklung.log-Datei ansehen, wenn Sie Ihre Anwendung entwickeln, werden Sie in der Lage sein, das benötigte SQL zu sehen, um alle Aufträge für einen bestimmten Kunden auszuwählen.

Rails erstellt keine Tabellen, ohne dass Sie danach gefragt werden. Die Erstellung von Tabellen wird durch das Generieren einer Migration erreicht, die Tabellen für Sie erstellt/ändert. Die Tatsache, dass Sie ein Kundenmodell erstellen und darin angeben, dass es has_many: orders enthält, erstellt keine Auftragstabelle. Sie müssen dies innerhalb einer Migration für sich selbst tun, um eine Auftragstabelle zu erstellen. Innerhalb dieser Migration müssen Sie entweder eine Spalte "customer_id" hinzufügen oder mithilfe der Anweisung "belongs_to: customer" das Feld "customer_id" zur Tabelle "orders" hinzufügen.

+0

ich ein wenig mehr Detail in der Antwort gesetzt werden. –