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?
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
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"
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 }
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.
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.
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