Es ist nicht gut dokumentiert, aber Sie können ein Lambda als Standardwert bei einer Migration angeben, und das wird das Richtige tun. Wenn Sie Folgendes sagen:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
dann wird der Standardwert der Spalte auf now()
gesetzt und die Datenbankfunktion now()
wird erst aufgerufen, wenn ein Standardwert für die Spalte benötigt wird. Dann, wenn Sie \d stratum_worker_submissions
in psql
Sie werden sehen:
created_at | timestamp without time zone | not null default now()
wie gewünscht. Jeder andere Standardwert wird ausgewertet, wenn die Migration ausgeführt wird, und Sie erhalten einen festen Zeitstempel als Standardwert.
Alternativ können Sie dies auch immer manuell mit SQL tun:
def up
connection.execute(%q(
alter table stratum_worker_submissions
alter column created_at
set default now()
))
end
def down
connection.execute(%q(
alter table stratum_worker_submissions
alter column created_at
drop default
))
end
Beachten Sie, dass Sie beim manuellen Ändern des Schemas mit SQL möglicherweise Dinge tun, die nicht in db/schema.rb
erscheinen da Sie schnell in SQL einsteigen können, das ActiveRecord nicht versteht. In diesem Fall können Sie von db/schema.rb
wechseln zu db/structure.sql
durch Ändern von config/application.rb
:
config.active_record.schema_format = :sql
und dann db/schema.rb
ersetzen mit db/structure.sql
in der Revisionskontrolle und unter Verwendung der db:structure
Rechenaufgaben anstelle des üblichen db:schema
Aufgaben.