web-dev-qa-db-fra.com

Spécification du nom de la colonne dans une migration "références"

Je veux faire un migration dans Rails, en référençant une autre table. Habituellement, je ferais quelque chose comme:

add_column :post, :user, :references

Cela crée une colonne nommée user_id dans la table posts. Mais si, au lieu de user_id, Je veux quelque chose comme author_id? Comment puis je faire ça?

111
caarlos0

Faites-le manuellement:

add_column :post, :author_id, :integer

mais maintenant, lorsque vous créez la déclaration d'appartenance_s_to, vous devrez la modifier, vous devez donc appeler

def post
    belongs_to :user, :foreign_key => 'author_id'
end
53
mschultz

Dans Rails 4.2 + , vous pouvez également définir clés étrangères dans la base de données également, ce qui est une excellente idée .

Pour les associations simples, cela peut aussi être fait sur t.references ajouter foreign_key: true, mais dans ce cas, vous aurez besoin de deux lignes.

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"
239
ecoologic

Pour Rails 5+

Définition initiale:

Si vous définissez votre table de modèle Post, vous pouvez définir references, index et foreign_key en une ligne:

t.references :author, index: true, foreign_key: { to_table: :users }

Mettre à jour existant:

Si vous ajoutez des références à une table existante, procédez comme suit:

add_reference :posts, :author, foreign_key: { to_table: :users }

Note: La valeur par défaut pour index est true.

201
Sheharyar

Dans Rails 4, lorsque vous utilisez postgresql et le schema_plus gem, vous pouvez simplement écrire

add_reference :posts, :author, references: :users

Cela créera une colonne author_id, Qui fait correctement référence à users(id).

Et dans ton modèle, tu écris

belongs_to :author, class_name: "User"

Notez que lors de la création d'une nouvelle table, vous pouvez l'écrire comme suit:

create_table :things do |t| 
  t.belongs_to :author, references: :users 
end 

Remarque: la gemme schema_plus Dans son intégralité n’est pas compatible avec Rails 5+, mais cette fonctionnalité est offerte par la gem schema_auto_foreign_keys (composant de schema_plus) qui est compatible avec Rails 5.

83
nathanvda

Si vous n'utilisez pas de clé étrangère, le nom de la table de l'autre table n'a pas d'importance.

add_reference :posts, :author

À partir de Rails 5 , si vous utilisez une clé étrangère, vous pouvez spécifier le nom de l'autre table. dans les options de clé étrangère (voir https://github.com/Rails/rails/issues/2156 pour discussion)

add_reference :posts, :author, foreign_key: {to_table: :users}

Avant Rails 5, vous devez ajouter la clé étrangère séparément):

add_foreign_key :posts, :users, column: :author_id
48
jes5199