2
votes

Ruby on rails - configurer une clé étrangère nulle

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


0 commentaires

3 Réponses :


4
votes

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


2 commentaires

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)



0
votes

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é.


0 commentaires

3
votes

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


0 commentaires