Sie müssen eine separate Verknüpfungstabelle mit nur einem restaurant_id
und user_id
(kein Primärschlüssel) in alphabetischer Reihenfolge hinzufügen .
Führen Sie zuerst Ihre Migrationen aus und bearbeiten Sie dann die generierte Migrationsdatei.
Schienen 3
rails g migration create_restaurants_users_table
Schienen 4 :
rails g migration create_restaurants_users
Schienen 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Aus den Dokumenten :
Es gibt auch einen Generator, der Join-Tabellen erzeugt, wenn JoinTable Teil des Namens ist:
Ihre Migrationsdatei (beachten :id => false
Sie Folgendes: Sie verhindert die Erstellung eines Primärschlüssels):
Schienen 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
Schienen 4
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
erstellt automatisch die erforderlichen Indizes. def change
erkennt automatisch eine Vorwärts- oder Rückwärtsmigration, ohne dass ein Auf / Ab erforderlich ist.
Schienen 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Hinweis: Es gibt auch eine Option für einen benutzerdefinierten Tabellennamen, der als Parameter an create_join_table übergeben werden kann table_name
. Aus den Dokumenten
Standardmäßig ergibt sich der Name der Verknüpfungstabelle aus der Vereinigung der ersten beiden Argumente für create_join_table in alphabetischer Reihenfolge. Geben Sie zum Anpassen des Tabellennamens die Option: table_name an:
restaurant_id
. Die zweite hilft, wenn Sie weiter suchenuser_id
. Wenn Sie nach beiden suchen, würde ich denken, dass die Datenbank intelligent genug ist, um nur eine zu benötigen. Ich denke, der zweite muss nicht wirklich zusammengesetzt werden. Dies war eher nur ein Beispiel. Dies war jedoch eine Rails-Frage, sodass das Posten im DB-Bereich eine vollständigere Antwort liefern würde.rails g migration create_restaurants_users
ohne Tabelle sein .Die Antworten hier sind ziemlich veraltet. Ab Rails 4.0.2 werden Ihre Migrationen verwendet
create_join_table
.Führen Sie zum Erstellen der Migration Folgendes aus:
Dadurch wird Folgendes generiert:
Wenn Sie diese Spalten indizieren möchten, kommentieren Sie die entsprechenden Zeilen aus und los geht's!
quelle
unique: true
. Dadurch wird verhindert, dass doppelte Beziehungen erstellt werden.Beachten Sie beim Erstellen der Verknüpfungstabelle sorgfältig die Anforderung, dass die beiden Tabellen in alphabetischer Reihenfolge im Migrationsnamen / der Migrationsklasse aufgeführt sein müssen . Dies kann Sie leicht beißen, wenn Ihre Modellnamen ähnlich sind, z. B. "abc" und "abb". Wenn du rennen würdest
Ihre Beziehungen werden nicht wie erwartet funktionieren. Sie müssen verwenden
stattdessen.
quelle
Für HABTM-Beziehungen müssen Sie eine Verknüpfungstabelle erstellen. Es gibt nur eine Join-Tabelle und diese Tabelle sollte keine ID-Spalte haben. Versuchen Sie diese Migration.
Sie müssen diese Tutorials für Beziehungsschienen überprüfen
quelle