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