È necessario aggiungere una tabella di join separata con solo un restaurant_id
e user_id
(nessuna chiave primaria), in ordine alfabetico .
Esegui prima le migrazioni, quindi modifica il file di migrazione generato.
Rotaie 3
rails g migration create_restaurants_users_table
Rotaie 4 :
rails g migration create_restaurants_users
Rotaie 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Dai documenti :
C'è anche un generatore che produrrà tabelle di join se JoinTable fa parte del nome:
Il tuo file di migrazione (nota il :id => false
; è ciò che impedisce la creazione di una chiave primaria):
Rotaie 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
Rotaie 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
creerà automaticamente gli indici necessari. def change
rileverà automaticamente una migrazione in avanti o rollback, senza bisogno di up / down.
Rotaie 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Nota: esiste anche un'opzione per un nome di tabella personalizzato che può essere passato come parametro a create_join_table chiamato table_name
. Dai documenti
Per impostazione predefinita, il nome della tabella di join deriva dall'unione dei primi due argomenti forniti a create_join_table, in ordine alfabetico. Per personalizzare il nome della tabella, fornire un'opzione: nome_tabella: