206 votes

Comment créer une valeur par défaut pour les attributs dans le modèle de Rails activerecord?

Je veux créer une valeur par défaut pour un attribut en le définissant dans ActiveRecord. Par défaut chaque fois que le dossier est créé, je veux avoir une valeur par défaut pour l’attribut `` . J’ai essayé de faire cela :

Mais lors de la création j’ai toujours récupérer cette erreur de la base de données :

Donc je suppose que la valeur ne s’appliquait pas à l’attribut.

Quelle serait la façon élégante de faire cela dans les Rails ?

Merci beaucoup.

309voto

Jim Points 3104

Vous pouvez définir une option par défaut pour la colonne lors de la migration

OU

Vous pouvez utiliser un rappel, before_save

197voto

BeepDog Points 1891

Parce que j’ai rencontré ce problème juste tout à l’heure et les options pour Rails 3.0 sont un peu différentes, je vais donner une autre réponse à cette question.

Dans Rails 3.0, vous voulez faire quelque chose comme ceci :

103voto

Tim Santeford Points 10126

Quand j’ai besoin des valeurs par défaut son habituellement pour les nouveaux enregistrements avant l’affichage de la nouvelle action est restitué. La méthode suivante fixera les valeurs par défaut pour les nouveaux enregistrements seulement afin qu’ils soient disponibles lors du rendu de formulaires. et sont trop tard et ne fonctionnera pas si vous voulez que les valeurs par défaut s’affiche dans les champs de saisie.

78voto

Daniel Kristensen Points 1106

Vous pouvez le faire sans écrire de code du tout  :) Vous avez juste besoin de définir la valeur par défaut pour la colonne dans la base de données. Vous pouvez le faire dans vos migrations. Par exemple :

Espoir qui aide.

22voto

EmFi Points 18645

La solution dépend d'un certain nombre de choses.

Est la valeur par défaut dépend de l'information disponible au moment de la création? Pouvez-vous essuyez la base de données avec un minimum de conséquences?

Si vous avez répondu à la première question est oui, alors vous voulez utiliser Jim solution

Si vous avez répondu à la deuxième question est oui, alors vous voulez utiliser de Daniel solution

Si vous avez répondu non aux deux questions, vous êtes probablement mieux de l'ajout et de l'exécution d'une nouvelle migration.

class AddDefaultMigration < ActiveRecord::Migration
  def self.up
     change_column :tasks, :status, :string, :default => default_value, :null => false
  end
end

:chaîne de caractères peut être remplacé par n'importe quel type de ActiveRecord::Migration reconnaît.

L'UC est pas cher, donc la redéfinition de la Tâche dans de Jim solution ne va pas causer de nombreux problèmes. En particulier dans un environnement de production. Cette migration est la façon correcte de le faire, puisqu'il est chargé et l'a appelé beaucoup moins souvent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X