127 votes

Comment définir la valeur par défaut d'une colonne datetime dans le script de migration?

Considérez le script de création de table ci-dessous:

 create_table :foo do |t|
  t.datetime :starts_at, :null => false
end
 

Est-il possible de définir la valeur par défaut comme heure actuelle?

J'essaie de trouver un équivalent indépendant de la base de données en rails pour les définitions de colonne SQL données ci-dessous:

Syntaxe Oracle

 start_at DATE DEFAULT SYSDATE() 
 

Syntaxe MySQL

 start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
 

OU

 start_at DATETIME DEFAULT NOW()
 

125voto

Szymon Guz Points 5357

Vous pouvez ajouter une fonction dans un modèle comme celui-ci:

  before_create :set_foo_to_now
  def set_foo_to_now
    self.foo = Time.now
  end

Alors que le modèle sera défini à l'heure actuelle dans le modèle.

Vous pouvez aussi mettre un peu de code sql de la migration pour le réglage de la valeur par défaut à la base de données, quelque chose comme:

execute 'alter table foo alter column starts_at set default now()'

Mettre quelque chose comme ceci:

create_table :foo do |t|
  t.datetime :starts_at, :null => false, :default => Time.now
end

les causes de l'exécution de la Temps.maintenant la fonction au cours de la migration alors la table dans la base de données est créée comme ceci:

create table foo ( starts_at timestamp not null default '2009-01-01 00:00:00');

mais je pense que ce n'est pas ce que vous voulez.

12voto

Jim Points 3104

Si vous avez une colonne datetime appelée created_at ou created_on , ActiveRecord la définira de manière "magique" sur la date et l'heure de création. Vous n'avez rien d'autre à faire que d'avoir cette colonne.

Vous pouvez également avoir updated_at ou updated_on et il sera mis à jour quand un enregistrement est mis à jour.

10voto

Giovanni Points 1010

Je cherchais des solutions similaires, mais j'ai fini par utiliser https://github.com/FooBarWidget/default_value_for .

Le plugin default_value_for permet de définir des valeurs par défaut pour les modèles ActiveRecord de manière déclarative. Par exemple:

 class User < ActiveRecord::Base
  default_value_for :name, "(no name)"
  default_value_for :last_seen do
    Time.now
  end
end

u = User.new
u.name       # => "(no name)"
u.last_seen  # => Mon Sep 22 17:28:38 +0200 2008
 

-2voto

mecampbellsoup Points 41

Je ne l'ai pas essayé, mais peut-être que ça marche:

 create_table :foo do |t|
  t.datetime :starts_at, null: false, default: lambda { Time.zone.now }
end
 

Je suppose que ce n'est pas le cas ... doigts croisés!

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