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 dans les rails pour les définitions de colonne SQL données ci-dessous:
Syntaxe d'Oracle
start_at DATE DEFAULT SYSDATE()
Syntaxe MySQL
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
OU
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
la source
la source
CURRENT_TIMESTAMP
sera l'heure du début de la transaction en cours, de sorte que plusieurs enregistrements créés dans la même transaction auront la même valeur. Si vous voulez l'heure actuelle d'exécution de l'instruction (en ignorant le contexte de transaction), vérifiezCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
et c'est à quoi ça ressemble dans le schema.rbt.datetime "start_date", default: -> { "now()" }
Mais quand j'ai créé un nouvel enregistrement, il n'est pas rempli . Une idée pourquoi?post.reload
pour obtenir ces valeurs. C'est expliqué ici: stackoverflow.com/questions/53804787/…Vous pouvez ajouter une fonction dans un modèle comme celui-ci:
Pour que le modèle définisse l'heure actuelle dans le modèle.
Vous pouvez également placer du code SQL dans la migration pour définir la valeur par défaut au niveau de la base de données, quelque chose comme:
Définir quelque chose comme ceci:
provoque l'exécution de la fonction Time.now pendant la migration, de sorte que la table de la base de données est créée comme ceci:
mais je pense que ce n'est pas ce que tu veux.
la source
new()
). Doncself.foo = Time.now
, remplacera la valeur que vous pourriez donnernew()
. Je suggère à laself.foo = Time.current unless self.foo.present?
place.:starts_at, :default => 'now()'
dans le schema.rb. Cependant, cela ne fonctionnera pas lors de l'utilisationrake db:schema:dump
qui remplacera le schéma.rb avec:starts_at, :default => '2015-05-29 09:46:33'
(ou quelle que soit la date à laquelle vous lancez le script) ... triste ....Vous n'avez rien d'autre à faire que d'avoir cette colonne.
la source
Je fais habituellement:
Donc, vous
schema.rb
allez avoir quelque chose comme:la source
rake db:migrate
, pas lorsque vous chargez votre fichier de schéma avec quelque chose commerake db:schema:load
.Je cherchais des solutions similaires mais j'ai fini par utiliser https://github.com/FooBarWidget/default_value_for .
Le
default_value_for
plugin permet de définir des valeurs par défaut pour les modèles ActiveRecord de manière déclarative. Par exemple:la source
Si vous devez modifier une colonne DateTime existante dans Rails 5 (plutôt que de créer une nouvelle table comme spécifié dans d'autres réponses) afin qu'elle puisse profiter de la fonctionnalité de date par défaut, vous pouvez créer une migration comme celle-ci:
la source
Dans la réponse donnée par @ szymon-lipiński (Szymon Lipiński), la méthode d'exécution n'a pas fonctionné pour moi. Il lançait une erreur de syntaxe MySQL.
La syntaxe MySQL qui a fonctionné pour moi est la suivante.
Ainsi, pour définir la valeur par défaut d'une colonne datetime dans le script de migration, vous pouvez procéder comme suit:
la source