Itu tidak didokumentasikan dengan baik tetapi Anda dapat menyediakan lambda sebagai nilai default dalam migrasi dan itu akan melakukan Hal yang Benar. Jika Anda mengatakan ini:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
maka nilai default kolom akan diatur ke now()
dan fungsi database now()
tidak akan dipanggil sampai nilai default diperlukan untuk kolom. Kemudian jika Anda \d stratum_worker_submissions
di psql
Anda akan melihat:
created_at | timestamp without time zone | not null default now()
seperti yang diinginkan. Default lainnya akan dievaluasi saat migrasi berjalan dan Anda akan mendapatkan stempel waktu tetap sebagai default.
Atau, Anda selalu dapat melakukannya dengan tangan menggunakan 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
Perhatikan bahwa jika Anda mulai mengubah skema secara manual dengan SQL, Anda mungkin mulai melakukan hal-hal yang tidak akan muncul di db/schema.rb
karena Anda dapat dengan cepat masuk ke SQL yang tidak dimengerti oleh ActiveRecord. Jika itu terjadi maka Anda dapat mengubah dari db/schema.rb
ke db/structure.sql
dengan mengubah config/application.rb
:
config.active_record.schema_format = :sql
lalu ganti db/schema.rb
dengan db/structure.sql
dalam kontrol revisi dan menggunakan db:structure
menyapu tugas menggantikan db:schema
yang biasa tugas.