Comment définir une clé étrangère nulle? car je souhaite associer deux tables, utilisateur et équipe, mais il n'est pas obligatoire pour un utilisateur d'avoir une équipe.
rails g scaffold Time name: string user: references
3 Réponses :
Il est permis d'être nul au niveau de la base de données. Dans les modèles de temps, ajoutez une option facultative, comme - appartient_to: utilisateur, facultatif: vrai
Consultez la documentation associée ici
il suffit de définir : optionnel
dans l'équipe modèle qui rails comprendra que la clé étrangère n'est pas obligatoire?
Oui (il n'y a pas de clé étrangère pas de contrainte nulle par défaut)
Lorsque vous concevez vos tables, il n'est pas conseillé de mettre des données qui ne sont pas liées au parent.
Par exemple: L'utilisateur peut avoir plusieurs photos
photos table id url user_id
user table id name
si vous allez stocker des photos sans user_id, ces photos ne seront pas récupérées lorsque vous voudrez y accéder photos d'un utilisateur particulier. C'est pourquoi les rails ne vous permettent pas de stocker des enregistrements si vous avez défini une colonne comme references
.
vous pouvez faire référence au problème ici DHH github (rails) .
Dans l'association, ajoutez optionnel: true
pour obtenir cette fonctionnalité.
Niveau Rails (validation du modèle)
Dans Rails 4.x, lors de la définition d'une référence, l'enregistrement associé pour appartient_to
est facultatif. Depuis Rails 5.x, cette association est requise.
Dans Rails 4, pour rendre obligatoire l'enregistrement associé, vous allez faire
create_table :photos do |t| t.references :user, null: true, foreign_key: true end
Dans Rails 5, pour rendre l'enregistrement associé facultatif, vous devez effectuer
class Photo belongs_to :user, optional: true end
Niveau de base de données
Vous devez vous assurer que votre migration ne ont la contrainte null: false
. Vous devriez vérifier la migration pour vous assurer qu'elle ressemble à celle ci-dessous
class Photo belongs_to :user, required: true end