十分に文書化されていませんが、移行のデフォルト値としてラムダを指定できます。これにより、正しいことが実行されます。あなたがこれを言うなら:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
その場合、列のデフォルト値はnow()
に設定されます。 およびデータベース関数now()
列にデフォルト値が必要になるまで呼び出されません。次に、\d stratum_worker_submissions
の場合 psql
で 表示されます:
created_at | timestamp without time zone | not null default now()
望んだ通りに。その他のデフォルトは、移行の実行時に評価され、最終的には固定のタイムスタンプがデフォルトとして使用されます。
または、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
SQLを使用してスキーマを手動で変更し始めると、db/schema.rb
に表示されないことを開始する可能性があることに注意してください。 ActiveRecordが理解できないSQLにすぐに入ることができるからです。その場合は、db/schema.rb
から変更できます。 db/structure.sql
へ config/application.rb
を変更する :
config.active_record.schema_format = :sql
次に、db/schema.rb
を置き換えます db/structure.sql
を使用 リビジョン管理でdb:structure
を使用する 通常のdb:schema
の代わりにタスクをレーキします タスク。