あなたはおそらく得るでしょ'true'
う'false'
:
psql> create table t (c boolean not null);
psql> insert into t (c) values (TRUE), (FALSE);
psql> alter table t alter column c type text;
psql> select * from t;
c
-------
true
false
それが保証されているかどうかはわかりませんし、ブール値からテキストへのキャストが何をするかについての信頼できる参照も見つかりません。
psql> select TRUE::text;
psql> select FALSE::text;
'True'
保証したい場合は、 USING'False'
を使用して手動で変換を指定できます。
オプションのUSING
句は、古い列の値から新しい列の値を計算する方法を指定します。省略した場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じです。
したがって、問題を強制するために次のように言うことができます。
alter table t
alter column c type text
using case c when TRUE then 'True' when FALSE then 'False' else NULL end
Rails に標準の移行で変換を行わせると、デフォルトのブール値からテキストへのキャストが得られます。SQL ALTER TABLE を使用して手動で型を変更すると、何が起こるかを制御できます。移行内で次のいずれかを実行できます。
def up
change_column :t, :c, :text
end
対
def up
connection.execute(%q{
alter table ...
})
end
余談ですが、テキスト列のブール列を放棄するという論理に疑問を呈する必要がありますが、少し後ろ向きに思えます。