Můžete to udělat jedním tahem docela snadno pomocí klauzule USING ALTER TABULKA :
Jednoduché přetypování typu SQL by vám zanechalo řetězce 'true'
a 'false'
takže chcete přidat POUŽÍVÁNÍ. AR bych obešel a udělal to ručně:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
Důležitou součástí pro vás je using case ...
část na konci. Můžete jej použít společně s obvyklým change_column
v AR-ish přimět AR, aby udělal správnou věc:
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
Všimněte si, že používám text
jako typ sloupce. Rails bude používat varchar(255)
uvnitř databáze, když řeknete :string
bez omezení je to s PostgreSQL docela zbytečné, protože zpracovává úložiště pro všechny typy řetězců v podstatě stejně interně
, omezení délky pro char(n)
a varchar(n)
ve skutečnosti je jejich použití dražší než text
. Pak už jen čas :string
dává smysl u PostgreSQL je, když máte důvod zahrnout konkrétní :limit
(a poté text
sloupec s CHECK
omezení délky by dávalo větší smysl, ale AR je příliš hloupý na to, aby věděl o "pokročilých" věcech, jako je CHECK
omezení).