2010-10-25 20 views
42

Si j'utilise une migration de mettre à jour une base de données, et j'ajouter un champ entier comme ceci:Comment faire: default => 0 et: null => false diffère pour les champs entiers dans les migrations?

t.integer :foo :default => 0, :null => false 

Quel est l'état par défaut des enregistrements existants et nouveaux dans la base de données? J'espère que la réponse est: - Les deux vont lire foo comme 0.

Est-ce que défaut => 0 nécessaire, si j'ai: null => faux?

essaie de comprendre la différence entre les deux ...

+6

dépend de votre base de données. Pas de Rails. – shingara

Répondre

87

:null => false indique à votre base de données de ne pas accepter NULL valeurs.

:default => 0 fait deux choses:

  1. votre base de données Dites-utiliser « 0 » comme valeur par défaut lorsque NULL ou rien est spécifié dans une requête.
  2. Dites aux rails d'utiliser '0' comme valeur par défaut lors de la création d'un nouvel objet. Le point 2 s'assure que lorsque vous enregistrez votre nouvel objet, vous avez réellement une valeur valide en place.

Pour répondre à votre question: Si vous ne voulez pas de valeurs NULL dans votre base de données, réglez :null => false, sinon utilisez simplement le paramètre :default. Rappelez-vous, '0' et NULL ne sont pas les mêmes choses.

Ne pas avoir de valeurs NULL peut être important à des fins d'indexation ou si vous devez fournir un accès direct à une base de données à un tiers.

+0

Par là, voulez-vous dire qu'il sera lu comme 0 si j'ai un enregistrement de base de données existant avant la migration? Donc, si je fais Table.value, sur un ancien enregistrement, la valeur will == 0? – cmaughan

+0

Oui. Si vous avez une colonne de table qui contient des valeurs 'NULL', mais que vous définissez une valeur par défaut, cette valeur par défaut sera renvoyée. – Ariejan

+1

Voici l'information éclairante et précieuse: "Ne pas avoir de valeurs NULL peut être important pour l'indexation ou si vous devez fournir un accès direct à un tiers." – ahnbizcad