Nó không được ghi chép đầy đủ nhưng bạn có thể cung cấp lambda làm giá trị mặc định trong quá trình di chuyển và điều đó sẽ thực hiện Điều đúng đắn. Nếu bạn nói điều này:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
thì giá trị mặc định của cột sẽ được đặt thành now()
và hàm cơ sở dữ liệu now()
sẽ không được gọi cho đến khi một giá trị mặc định là cần thiết cho cột. Sau đó, nếu bạn \d stratum_worker_submissions
trong psql
bạn sẽ thấy:
created_at | timestamp without time zone | not null default now()
như mong muốn. Mọi mặc định khác sẽ được đánh giá khi quá trình di chuyển chạy và bạn sẽ kết thúc với một dấu thời gian cố định làm mặc định.
Ngoài ra, bạn luôn có thể làm điều đó bằng tay bằng 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
Lưu ý rằng nếu bạn bắt đầu thay đổi lược đồ bằng SQL theo cách thủ công, bạn có thể bắt đầu thực hiện những việc không xuất hiện trong db/schema.rb
vì bạn có thể nhanh chóng truy cập vào SQL mà ActiveRecord không hiểu. Nếu điều đó xảy ra thì bạn có thể thay đổi từ db/schema.rb
thành db/structure.sql
bằng cách thay đổi config/application.rb
:
config.active_record.schema_format = :sql
và sau đó thay thế db/schema.rb
với db/structure.sql
trong kiểm soát sửa đổi và sử dụng cấu trúc db:structure
tác vụ cào thay cho db:schema
thông thường nhiệm vụ.