Nie jest to dobrze udokumentowane, ale możesz podać lambdę jako wartość domyślną w migracji, a to wystarczy. Jeśli powiesz to:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
wtedy domyślna wartość kolumny zostanie ustawiona na now()
i funkcja bazy danych now()
nie zostanie wywołana, dopóki dla kolumny nie będzie potrzebna wartość domyślna. Następnie, jeśli \d stratum_worker_submissions
w psql
zobaczysz:
created_at | timestamp without time zone | not null default now()
zgodnie z życzeniem. Każda inna wartość domyślna zostanie oceniona po uruchomieniu migracji i otrzymasz jako domyślną stałą sygnaturę czasową.
Alternatywnie, zawsze możesz to zrobić ręcznie za pomocą SQL:
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
Zauważ, że jeśli zaczniesz ręcznie zmieniać schemat za pomocą SQL, możesz zacząć robić rzeczy, które nie pojawią się w db/schema.rb
ponieważ możesz szybko dostać się do SQL, którego ActiveRecord nie rozumie. Jeśli tak się stanie, możesz zmienić z db/schema.rb
do db/structure.sql
zmieniając config/application.rb
:
config.active_record.schema_format = :sql
a następnie zastępując db/schema.rb
z db/structure.sql
w kontroli wersji i przy użyciu db:structure
rake zadania zamiast zwykłego db:schema
zadania.