58

私はすでに少しグーグルで検索しましたが、私の問題に対する満足のいく答えはないようです。

文字列型の列を持つテーブルがあります。次の移行を実行したい:

class ChangeColumnToBoolean < ActiveRecord::Migration
    def up
        change_column :users, :smoking, :boolean
    end
end

これを実行すると、次のエラーが表示されます

PG::Error: ERROR:  column "smoking" cannot be cast automatically to type boolean
HINT:  Specify a USING expression to perform the conversion.
: ALTER TABLE "users" ALTER COLUMN "smoking" TYPE boolean

純粋な SQL を使用してこの移行を実行できることはわかっていますが、Rails で実行できればさらに良いでしょう。私はRailsコードを調べましたが、そのような可能性はないようですが、誰かが方法を知っているのでしょうか?

私は興味がありません: - 純粋な SQL - 列の削除 - 別の列の作成、データの変換、元の削除、名前の変更

4

4 に答える 4

117

列の文字smoking列がすでに有効なブール値である場合、次のステートメントはデータを失うことなく列の型を変更します。

change_column :users, :smoking, 'boolean USING CAST(smoking AS boolean)'

同様に、次のステートメントを使用して列を整数にキャストできます。

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

Postgresを使用しています。このソリューションが他のデータベースで機能するかどうかはわかりません。

于 2014-01-03T08:35:34.193 に答える
8

postgresのブール値に適しています:

change_column :table_name, :field,'boolean USING (CASE field WHEN \'your any string as true\' THEN \'t\'::boolean ELSE \'f\'::boolean END)'

そして、さらにいくつか追加することができますWHEN-THEN式の条件

他のデータベース サーバーの場合、式はデータベース サーバーの構文に基づいて作成されますが、原則は同じです。手動変換アルゴリズムのみで、SQL がまったくない場合、残念ながら十分ではありません。

この構文change_column :table, :field, 'boolean USING CAST(field AS boolean)'は、フィールドの内容が次のような場合にのみ適しています: true / false / null

于 2015-03-03T14:29:19.413 に答える