46

Ho esaminato molti post SO e google per generare la migrazione della tabella di join per l'associazione has many and belongs to many e non funziona nulla.Genera migrazione - crea tabella join

Tutte le soluzioni generano un file di migrazione vuoto.

Sto usando rails 3.2.13 e ho due tabelle: security_users e assignments. Queste sono alcune delle cose che ho provato:

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 

Qualcuno può dire come creare una migrazione della tabella join tra due tabelle?

risposta

33

Esegui questo comando per generare il file di migrazione vuota (non viene popolato automaticamente, è necessario compilare da soli):

rails generate migration assignments_security_users 

aprire il file di migrazione generato e aggiungere questo codice:

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 

Quindi eseguire rake db:migrate dal terminale. Ho creato a quiz on many_to_many relationships con un semplice esempio che potrebbe aiutarti.

+2

Se lo fai in questo modo, assicurati di aggiungere '' 'null: false''' alle definizioni dei campi. Ad esempio: '' 't.integer: assignment_id, null: false'''. Questo proteggerà da situazioni orribili in cui si finisce con una tabella di join che non punta da nessuna parte, i dati perdono integrità e il codice cade. (O finisce con il brutto codice di guardia incline agli insetti). –

+0

Concordo con @Powers e aggiungerei che forse è un'idea aggiungere un indice a quelle colonne? – BKSpurgeon

115

Per compilati automaticamente il comando create_join_table nella riga di comando, dovrebbe assomigliare a questo:

rails g migration CreateJoinTableProductsSuppliers products suppliers 

Per un modello di prodotto e un modello fornitore. Rails creerà una tabella intitolata "products_suppliers". Nota la pluralizzazione.

(Nota a margine che generation comando può essere ridotto a solo g)

+42

Per rendere più significative le tabelle congiunte: 'rails g migration CreateJoinTableProductsFornitore di prodotti fornitori' – zishe

+7

Fare attenzione quando si utilizza CreateJoinTable perché quando si tratta di tabelle con un prefisso come my_products e my_suppliers, genererà una tabella di join come this_products_my_suppliers mentre ActiveRecord si aspetta di farlo essere my_products_suppliers. Quindi associazioni come MyProduct.first.my_suppliers non funzioneranno! Controlla https://github.com/rails/rails/issues/13683 - La mia soluzione era continuare a utilizzare CreateJoinTable ma aggiungi 'table_name:: my_products_suppliers' nella migrazione http://guides.rubyonrails.org/migrations.html –

+0

@ andrewcockerham questo non funzionava nei binari 3.2 –

11

solito mi piace avere il file "modello", così quando creo la tabella di aderire. Quindi lo faccio.

rails g model AssignmentSecurityUser assignments_security:references user:references