46

Ich habe viele SO und google Beiträge zum Generieren Migration von Join-Tabelle für has many and belongs to many Association und nichts funktioniert.Migration generieren - Join-Tabelle erstellen

Alle Lösungen generieren eine leere Migrationsdatei.

Ich verwende rails 3.2.13 und ich habe zwei Tabellen: security_users und assignments. Dies sind einige der Dinge, die ich versuche haben:

rails generate migration assignments_security_users 

rails generate migration create_assignments_security_users 

rails generate migration create_assignments_security_users_join_table 

rails g migration create_join_table :products, :categories (following the official documentation) 

rails generate migration security_users_assignments security_user:belongs_to assignments:belongs_to 

Kann jemand sagen, wie eine Migration Join-Tabelle zwischen zwei Tabellen erstellen?

Antwort

33

Führen Sie diesen Befehl, um die leere Migrationsdatei zu erzeugen (es ist nicht automatisch ausgefüllt wird, müssen Sie es selbst füllen):

rails generate migration assignments_security_users 

die erzeugte Migrationsdatei öffnen und fügen Sie diesen Code:

class AssignmentsSecurityUsers < ActiveRecord::Migration 
    def change 
    create_table :assignments_security_users, :id => false do |t| 
     t.integer :assignment_id 
     t.integer :security_user_id 
    end 
    end 
end 

Dann starten Sie rake db:migrate von Ihrem Terminal. Ich erstellte a quiz on many_to_many relationships mit einem einfachen Beispiel, das Ihnen helfen könnte.

+2

Wenn Sie dies auf diese Weise tun, stellen Sie sicher, dass Sie '' 'null: false''' zu den Felddefinitionen hinzufügen. Zum Beispiel: '' 't.integer: Zuweisungs_ID, null: false'''. Dies schützt vor grässlichen Situationen, in denen Sie eine Join-Tabelle haben, die nirgendwohin zeigt, Ihre Daten verlieren Integrität und Ihr Code fällt um. (Oder endet mit einem hässlichen und fehleranfälligen Sicherheitscode). –

+0

Ich stimme mit @Powers überein und würde hinzufügen, dass es vielleicht eine Idee ist, diesen Spalten einen Index hinzuzufügen? – BKSpurgeon

115

Um den create_join_table Befehl in der Befehlszeile automatisch ausgefüllt, soll es so aussehen:

rails g migration CreateJoinTableProductsSuppliers products suppliers 

für ein Produktmodell und ein Lieferantenmodell. Rails erstellt eine Tabelle mit dem Titel "products_suppliers". Beachten Sie die Pluralisierung.

(Randbemerkung, dass generation Befehl nur g kürzbar)

+42

Um gemeinsame Tabellen aussagekräftiger zu machen: 'rails g migration CreateJoinTableProductsSuppliers product supplier' – zishe

+7

Vorsicht bei der Verwendung von CreateJoinTable, denn wenn Tabellen mit einem Präfix wie my_products und my_suppliers behandelt werden, wird eine Join-Tabelle wie my_products_my_suppliers erzeugt, während ActiveRecord dies erwartet sei my_products_suppliers. Dann funktionieren Assoziationen wie MyProduct.first.my_suppliers nicht! Https://github.com/rails/rails/issues/13683 - Meine Lösung war, weiterhin CreateJoinTable zu verwenden, aber fügen Sie 'table_name:: my_products_suppliers' in die Migration ein http://guides.rubyonrails.org/migrations.html –

+0

@ andrewcockerham das funktionierte nicht in schienen 3.2 –

11

ich in der Regel mag die „Modell“ Datei als auch haben, wenn ich den Tisch kommt erstellen. Deshalb tue ich es.

rails g model AssignmentSecurityUser assignments_security:references user:references 
Verwandte Themen