Lưu ý :Bạn có thể muốn xem brcebn's trả lời nếu bạn đang sử dụng phiên bản Rails mới hơn.
Rails sẽ cố gắng giải thích điều này:
t.string :uniqueid, default: md5(random()::text)
dưới dạng mã Ruby và :default => md5(...)
không có nghĩa trong Ruby. Nếu bạn trích dẫn nó, thì Rails sẽ nghĩ đó là một chuỗi và đặt giá trị mặc định cho uniqueid
chuỗi 'md5(random()::text)'
và điều đó sẽ không giúp ích được gì.
Nếu bạn muốn sử dụng lệnh gọi hàm trong mặc định cột, bạn có thể thực hiện alter table
bằng tay:
connection.execute(%q{
alter table your_table alter column uniqueid set default md5(random()::text)
})
Điều đó sẽ giúp bạn có được mặc định bạn muốn trong cơ sở dữ liệu nhưng bạn có thể nhận thấy rằng không có đề cập đến mặc định mới trong schema.rb
của bạn . Nếu bạn muốn một giản đồ có thể sử dụng được thì bạn sẽ phải sử dụng một lược đồ SQL thay thế bằng cách đặt nó vào application.rb
:
config.active_record.schema_format = :sql
Sau đó, xóa schema.rb
của bạn và sử dụng structure.sql
thay vì. Lưu ý rằng kết xuất lược đồ SQL đã bị hỏng cho đến 3.2 và có sự cố tải lược đồ trong các phiên bản Rails khác nhau (nhưng bạn luôn có thể psql < structure.sql
theo cách của bạn xung quanh điều đó). Mặt khác, kết xuất lược đồ SQL sẽ theo dõi những thứ ưa thích các khóa ngoại thực, kiểm tra các ràng buộc, trình kích hoạt, ...
BTW, nếu bạn thực sự muốn SHA thì bạn sẽ muốn xem digest
hàm từ pgcrypto
.