Bạn có thể làm điều đó một lần khá dễ dàng bằng cách sử dụng mệnh đề USING của ALTER BẢNG :
Một kiểu truyền kiểu SQL đơn giản sẽ để lại cho bạn các chuỗi 'true'
và 'false'
vì vậy bạn muốn thêm một SỬ DỤNG. Tôi sẽ bỏ qua AR và làm điều đó bằng tay:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Phần quan trọng đối với bạn là using case ...
một phần ở cuối. Bạn có thể sử dụng nó cùng với AR-ish change_column
thông thường bằng cách lừa AR thực hiện Điều đúng:
class ChangeColumnTypeInUsers < ActiveRecord::Migration
def up
change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
end
def down
change_column :users, :active, "boolean using active = 'active'"
end
end
Lưu ý rằng tôi đang sử dụng text
như kiểu cột. Rails sẽ sử dụng varchar(255)
bên trong cơ sở dữ liệu khi bạn nói :string
không có giới hạn, điều đó khá vô nghĩa với PostgreSQL vì nó xử lý bộ nhớ cho tất cả các loại chuỗi khá giống nhau nội bộ
, giới hạn độ dài trên char(n)
và varchar(n)
thực sự làm cho chúng đắt hơn để sử dụng so với text
. Sau đó, chỉ thời gian :string
có ý nghĩa với PostgreSQL là khi bạn có lý do để bao gồm một :limit
cụ thể (và sau đó là text
cột có CHECK
hạn chế về độ dài sẽ có ý nghĩa hơn nhưng AR quá ngu ngốc để biết về những thứ "nâng cao" như CHECK
ràng buộc).