Vous devez ajouter une table de jointure distincte avec uniquement un restaurant_id
et user_id
(pas de clé primaire), par ordre alphabétique .
Exécutez d'abord vos migrations, puis modifiez le fichier de migration généré.
Rails 3
rails g migration create_restaurants_users_table
Rails 4 :
rails g migration create_restaurants_users
Rails 5
rails g migration CreateJoinTableRestaurantUser restaurants users
À partir de la documentation :
Il existe également un générateur qui produira des tables de jointure si JoinTable fait partie du nom:
Votre fichier de migration (notez le :id => false
; c'est ce qui empêche la création d'une clé primaire):
Rails 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
Rails 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
créera automatiquement les indices nécessaires. def change
détectera automatiquement une migration en avant ou en arrière, pas besoin de haut / bas.
Rails 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Remarque: Il existe également une option pour un nom de table personnalisé qui peut être passé en tant que paramètre à create_join_table appelé table_name
. À partir des documents
Par défaut, le nom de la table de jointure provient de l'union des deux premiers arguments fournis à create_join_table, par ordre alphabétique. Pour personnaliser le nom de la table, fournissez une option: table_name: