web-dev-qa-db-fra.com

ajouter des associations aux modèles existants

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. 

46
Andrew

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.

68
jvnill

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.

17
SimonW

Générez une migration pour créer l'association:

Rails g migration AddUserIdToCars user_id:integer
rake db:migrate
7
Richard Brown

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
0
vinoth