ruby-on-rails - now - ruby on rails date format




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

Ceci est supporté maintenant dans Rails 5.

Voici un exemple de migration:

class CreatePosts < ActiveRecord::Migration[5.0]
  def change
    create_table :posts do |t|
      t.datetime :modified_at, default: -> { 'CURRENT_TIMESTAMP' }
      t.timestamps
    end
  end 
end

Voir la discussion à https://github.com/rails/rails/issues/27077 et y répondre par prathamesh-sonpatki

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 l'heure actuelle?

J'essaye de trouver un équivalent indépendant de DB dans des rails pour les définitions de colonne de SQL données ci-dessous:

Syntaxe Oracle

start_at DATE DEFAULT SYSDATE() 

Syntaxe de MySQL

start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP

OU

start_at DATETIME DEFAULT NOW()

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.

execute "ALTER TABLE mytable CHANGE `column_name` `column_name` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"

Ainsi, pour définir la valeur par défaut d'une colonne datetime dans le script de migration, procédez comme suit:

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

  execute "ALTER TABLE `foo` CHANGE `starts_at` `starts_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
end

Je fais habituellement:

def change
  execute("
    ALTER TABLE your_table
    ALTER COLUMN your_column
    SET DEFAULT CURRENT_TIMESTAMP
  ")
end

Donc, votre schema.rb va avoir quelque chose comme:

create_table "your_table", force: :cascade do |t|
  t.datetime "your_column", default: "now()"
end

Si vous avez une colonne datetime nommée created_at ou created_on , ActiveRecord la placera "magiquement" dans le datetime de création. Vous n'avez pas besoin de faire autre chose 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.


Sur Rails 5.1

class CreateClients < ActiveRecord::Migration[5.1]
  def change
    create_table :cars do |t|
      *******************************
      t.datetime :starts_at, :null => false, default: -> {'CURRENT_TIMESTAMP'}
      *******************************
      t.timestamps
    end
  end
end

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 va définir 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, par exemple:

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

Mettre quelque chose comme ça:

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

provoque l'exécution de la fonction Time.now lors de la migration, la table de la base de données est créée comme suit:

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 tu veux.





ruby-on-rails