Можете да го направите наведнъж доста лесно, като използвате клаузата USING на ALTER ТАБЛИЦА :
Едно просто преобразуване на SQL тип ще ви остави с низовете 'true'
и 'false'
така че искате да добавите USING. Бих заобиколил AR и бих го направил на ръка:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Важната част за вас е using case ...
част в края. Можете да го използвате заедно с обичайния AR-ish change_column
неща, като подмами AR да направи правилното нещо:
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
Имайте предвид, че използвам text
като тип колона. Rails ще използва varchar(255)
вътре в базата данни, когато кажете :string
без ограничение, това е доста безсмислено с PostgreSQL, тъй като той обработва съхранението за всички типове низове почти по същия начин вътрешно
, ограниченията за дължина на char(n)
и varchar(n)
всъщност ги прави по-скъпи за използване от text
. След това само време :string
има смисъл с PostgreSQL, когато имате причина да включите конкретен :limit
(и след това text
колона с CHECK
ограничението върху дължината би имало повече смисъл, но AR е твърде тъп, за да знае за "разширени" неща като CHECK
ограничения).