Je me demande comment je peux ajouter des associations à mes modèles. Supposons que je génère deux modèles
Rails generate model User
Rails generate model Car
Maintenant, je veux ajouter une association pour que les modèles acquièrent la forme
class User < ActiveRecord::Base
has_many :cars
end
class Car < ActiveRecord::Base
belongs_to :user
end
La question est de savoir comment appliquer cette modification par migration pour obtenir la table cars_users dans la base de données. Je prévois d'utiliser cette table dans mon code.
L'association belongs_to
attend une colonne association_id
dans la table correspondante. Puisque cars appartient à l'utilisateur, la table cars devrait avoir une colonne user_id
. Cela peut être accompli de 2 façons.
tout d'abord, vous pouvez générer la colonne lorsque vous créez le modèle
Rails g model car user_id:references
ou ajoutez simplement le user_id après avoir créé le modèle, comme la réponse de Richard Brown. Veillez à ce que si vous utilisez integer
au lieu de references
, vous devrez créer vous-même l'index.
Rails g migration add_user_id_to_cars user_id:integer
puis dans la migration générée, ajoutez
add_index :cars, :user_id
METTRE À JOUR:
Comme Joseph l'a mentionné dans les commentaires, la nécessité d'ajouter l'index manuellement a déjà été traitée dans la version actuelle de Rails. Je pense que cela a été introduit dans Rails 4. Vous pouvez en lire plus dans le Guide officiel Rails pour les migrations . Le Gist de celui-ci exécute le générateur suivant
bin/Rails g migration add_user_to_cars user:references
va créer une migration avec une ligne similaire à
add_reference :cars, :user, index: true
Cela ajoutera une colonne user_id
à la table cars et marquera également cette colonne à indexer.
Après l'explication de @ jvnill dans Rails 4 (et peut-être aussi dans Rails 3.2), vous pouvez le faire aussi (en évitant les parties id et en vous rappelant les convections exactes):
Rails g migration AddUserToCar user:references
Ce qui créera la migration suivante, en prenant en charge l'ajout de la colonne et de l'index avec toutes les conventions appropriées:
class AddUserToCar < ActiveRecord::Migration
def change
add_reference :cars, :user, index: true
end
end
A la fin, lancez toujours la migration:
rake db:migrate
Affichez votre schema.rb
pour afficher le nouvel index et la colonne user_id.
Générez une migration pour créer l'association:
Rails g migration AddUserIdToCars user_id:integer
rake db:migrate
Fichier de migration:
class Createuser < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
end
create_table :cars do |t|
t.belongs_to :user, index: true
t.varchar(255) :model
t.varchar(255) :color
end
end
end