2016-06-11 10 views
1

私は私のイベントモデルの通貨(CCY)の列を持っており、それは現在の文字列ですが、私はそれを整数に変更したいと思います。Herokuの:PG :: InvalidTextRepresentation:ERROR:整数のための無効な入力構文:「」

私のローカル環境で動作しますが、heroku run rake db:migrateをherokuに試してみると、次のエラーが表示されました。

rake aborted! 
StandardError: An error has occurred, this and all later migrations canceled: 

PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "" 
: ALTER TABLE "events" ALTER COLUMN "ccy" TYPE integer USING CAST(ccy AS integer) 

移行ファイルは次のとおりです。

class ChangeCcyToEvents < ActiveRecord::Migration 
    def change 
    change_column :events, :ccy, 'integer USING CAST(ccy AS integer)' 
    end 
end 

私は同様の質問PG::InvalidTextRepresentation: ERROR: invalid input syntax for integer: "M"を見つけたので、以下のように移行ファイルを変更しました。しかし結果は同じです。

class ChangeCcyToEvents < ActiveRecord::Migration 
    def change 
    Event.where(ccy: '').update_all(ccy: '') 
    change_column :events, :ccy, 'integer USING CAST(ccy AS integer)' 
    end 
end 

これまでにccy列には値がありません。

私に助言を与えることができれば幸いです。

答えて

1

あなたの移行では""を整数に変換しようとしていますが、これはポストグレスが正当なものであることを前提としています(有効な変換ではないため)。

あなたは列タイプを変更する前に、無効な場合のために、あなたのコンテンツを更新する必要があります:あなたはHerokuのよりのPostgreSQL異なるバージョンを使用しているので、おそらく開発(ローカルホスト)には文句はないされて

class ChangeCcyToEvents < ActiveRecord::Migration 
    def up 
    Event.where("ccy IS NULL OR ccy = ''").update_all({ccy: '0'}) 
    change_column :events, :ccy, 'integer USING CAST(ccy AS integer)' 
    end 

    def down 
    raise ActiveRecord::IrreversibleMigration 
    end 
end 

次回は、この種の列の移行でdefault valuesを使用してみてください。

+1

'ruby!= javascript'のように' return'を使うことはできません。 'LocalJumpError:unexpected return'というエラーが発生します。私はあなたが '次を意味すると思う' –

+0

@Зелёныйあなたは正しいです!私は 'next'コマンドに変更しました。 – Wikiti

+1

また、['update_all'](http://apidock.com/rails/v4.0.2/ActiveRecord/Relation/update_all)メソッドのための仕事です。 –

関連する問題