Можете да го направите наведнъж доста лесно, като използвате клаузата 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 ограничения).