Betrachten Sie das folgende Skript zur Tabellenerstellung:
create_table :foo do |t|
t.datetime :starts_at, :null => false
end
Ist es möglich, den Standardwert als aktuelle Zeit festzulegen?
Ich versuche, in Rails ein DB-unabhängiges Äquivalent für die unten angegebenen SQL-Spaltendefinitionen zu finden:
Oracle-Syntax
start_at DATE DEFAULT SYSDATE()
MySQL-Syntax
start_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ODER
start_at DATETIME DEFAULT NOW()
ruby-on-rails
Harish Shetty
quelle
quelle
CURRENT_TIMESTAMP
der Zeitpunkt des Starts der aktuellen Transaktion angegeben wird, sodass mehrere in derselben Transaktion erstellte Datensätze denselben Wert erhalten. Wenn Sie die aktuelle Uhrzeit der Anweisung anzeigen möchten (ohne Berücksichtigung des Transaktionskontexts), überprüfen Sie diesCLOCK_TIMESTAMP
.add_column :table_name, :start_date, :datetime, default: -> { 'CURRENT_TIMESTAMP' }
und so sieht es im schema.rb aus.t.datetime "start_date", default: -> { "now()" }
Aber als ich einen neuen Datensatz erstellt habe, wird er nicht gefüllt . Irgendeine Idee warum?post.reload
, um diese Werte zu erhalten. Es wird hier erklärt: stackoverflow.com/questions/53804787/…Sie können einem Modell wie diesem eine Funktion hinzufügen:
Damit das Modell die aktuelle Zeit im Modell einstellt.
Sie können auch SQL-Code in die Migration einfügen, um den Standardwert auf Datenbankebene festzulegen.
So etwas einstellen:
bewirkt, dass die Time.now-Funktion während der Migration ausgeführt wird, sodass die Tabelle in der Datenbank wie folgt erstellt wird:
aber ich denke, dass es nicht das ist, was du willst.
quelle
new()
). Soself.foo = Time.now
wird der Wert außer Kraft setzen Sie geben könntenew()
. Ich schlageself.foo = Time.current unless self.foo.present?
stattdessen vor.:starts_at, :default => 'now()'
execute eine Zeile in die schema.rb eingefügt wird. Dies funktioniert jedoch nicht, wennrake db:schema:dump
die schema.rb mit:starts_at, :default => '2015-05-29 09:46:33'
(oder unabhängig vom Datum, an dem Sie das Skript starten)Sie müssen nichts anderes tun, als diese Spalte zu haben.
quelle
Ich habe nach ähnlichen Lösungen gesucht, aber https://github.com/FooBarWidget/default_value_for nicht mehr verwendet .
Mit dem
default_value_for
Plugin können Standardwerte für ActiveRecord-Modelle deklarativ definiert werden. Beispielsweise:quelle
Normalerweise mache ich:
Also, du
schema.rb
wirst so etwas haben wie:quelle
rake db:migrate
, nicht, wenn Sie Ihre Schemadatei mit etwas wie ladenrake db:schema:load
.Wenn Sie eine vorhandene DateTime-Spalte in Rails 5 ändern müssen (anstatt eine neue Tabelle wie in anderen Antworten angegeben zu erstellen), damit die Standard-Datumsfunktion genutzt werden kann, können Sie eine Migration wie folgt erstellen:
quelle
In der Antwort von @ szymon-lipiński (Szymon Lipiński) hat die Ausführungsmethode bei mir nicht funktioniert. Es wurde ein MySQL-Syntaxfehler ausgelöst.
Die MySQL-Syntax, die für mich funktioniert hat, ist diese.
Das Festlegen des Standardwerts für eine datetime-Spalte im Migrationsskript kann folgendermaßen erfolgen:
quelle