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:
restaurant_id
. Le second vous aidera si vous recherchezuser_id
. Si vous recherchez les deux, je pense que la base de données serait suffisamment intelligente pour n'en avoir besoin que d'un. Donc je suppose que le second n'a pas vraiment besoin d'être composé. Ce n'était plus qu'un exemple. C'était une question Rails cependant, donc publier dans la section DB donnerait une réponse plus complète.rails g migration create_restaurants_users
sans table à la fin.Les réponses ici sont assez datées. Depuis Rails 4.0.2, vos migrations utilisent
create_join_table
.Pour créer la migration, exécutez:
Cela générera les éléments suivants:
Si vous souhaitez indexer ces colonnes, décommentez les lignes respectives et vous êtes prêt à partir!
la source
unique: true
. Cela évitera la création de relations en double.Lors de la création de la table de jointure, portez une attention particulière à l'exigence selon laquelle les deux tables doivent être répertoriées par ordre alphabétique dans le nom / la classe de migration. Cela peut facilement vous mordre si vos noms de modèles sont similaires, par exemple "abc" et "abb". Si tu devais courir
Vos relations ne fonctionneront pas comme prévu. Tu dois utiliser
au lieu.
la source
Pour les relations HABTM, vous devez créer une table de jointure. Il n'y a qu'une table de jointure et cette table ne doit pas avoir de colonne id. Essayez cette migration.
Vous devez vérifier ces didacticiels du guide des rails de relation
la source