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風の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のような「高度な」ものについて知ることはできません。 制約)。