2015-08-25 11 views
6

Ho scoperto un buon modo per generare tabelle di join per le mie relazioni HABTM nella mia app Rails.Qual è il comportamento di create_join_table di ActiveRecord :: Migration?

rails g migration CreateJoinTable table1 table2 

Questo genera un ActiveRecord::Migration che impiega il metodo create_join_table

Mi chiedo che cosa questo meraviglioso metodo misteriosa fa. Immagino che faccia una tabella (probabilmente senza un campo id) che abbia una colonna per la chiave straniera table1 e una colonna per la chiave straniera table2, ma la tabella ha altre caratteristiche? La mia abitudine per le tabelle di join è sempre stata quella di aggiungere un indice univoco su entrambe le colonne in modo che una relazione tra un record in tabella1 e un record in tabella2 non possa essere inserita due volte.

La mia domanda si riduce a: Se uso create_join_table devo continuare ad aggiungere quell'indice univoco, o questo metodo lo fa per me (penso che dovrebbe)?

Il documentation I usually look at non entra in questo tipo di dettagli.

risposta

0

Si scopre che non fa altro che le nozioni di base che ho descritto nella domanda. Ho trovato questo semplicemente eseguendo la migrazione e di vedere ciò che finisce in db/schema.rb

Per chi fosse interessato, per ottenere l'indice univoco fare questo:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users 
    add_index :posts_users, [:post_id, :user_id], unique: true, name: 'index_posts_users' 
    end 
end 
3

Chiamato senza alcun blocco, create_join_table crea solo un tavolo con due chiavi esterne che si riferiscono alle due tabelle unite.

Tuttavia, è possibile passare effettivamente un blocco quando si chiama il metodo per eseguire eventuali operazioni aggiuntive (ad esempio aggiungendo indici per esempio). Dal doc Rails:

create_join_table :products, :categories do |t| 
    t.index :product_id 
    t.index :category_id 
end 

Dai un'occhiata alla create_join_table documentation.

È possibile controllare il codice create_join_table nella parte inferiore (fare clic su Origine: mostra).

1

SchemaStatements#create_join_table() crea solo unirsi a tavola senza alcun indice di fantasia, ecc, ... Quindi, se si desidera utilizzare vincolo di unicità su due campi che hanno a che fare qualcosa di simile:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users do |t| 
     t.integer :post_id, index: true 
     t.integer :user_id, index: true 
     t.index [:post_id, :user_id], name: 'post_user_un', unique: true 
    end 
    end 
end 

Si prega di notare, inoltre, che create_join_table per impostazione predefinita NON crea il campo id.

Problemi correlati