1

「賞品」というコラムがありました。

create_table :contests do |t|
  t.text :prize

最近、これが常に整数であることに気付き、デフォルト値を設定したいと考えました。

def change
  change_column :contests, :prize, :integer, :default => 200

これは、MySQL DB を使用しているローカル マシンで正常に動作します。ただし、実稼働サイト (Heroku でホストされているため、Postgres DB が提供されます) にプッシュすると、次のエラーが発生します。

PGError: ERROR:  column "prize" cannot be cast to type "pg_catalog.int4"
: ALTER TABLE "contests" ALTER COLUMN "prize" TYPE integer

この記事: http://www.postgresonline.com/periodical.php?i_id=3では、この問題を解決するための USING の使用について説明しています。しかし、どうすればそれができるのか、これが私がやろうとしていることに適しているかどうかはわかりません.

これを理解するための洞察は非常に高く評価されます。

ありがとう!りんご

4

2 に答える 2

2

まず、この種の驚きを防ぐために、両方の環境で同じ DB を使用する必要があります。

移行で生の SQL を実行するには、この例を参照してください http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods

于 2012-06-30T19:21:01.643 に答える
1

手動で行う必要があると思います:

def up
    connection.execute(%q{
        alter table contests
        alter column prize type integer using cast(prize as integer),
        alter column price set default 200
    })
end

MySQL と PostgreSQL の両方で同じ移行を実行する場合:

def up
    case ActiveRecord::Base.connection
    when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
        connection.execute(%q{
            alter table contests
            alter column prize type integer using cast(prize as integer),
            alter column price set default 200
        })
    when ActiveRecord::ConnectionAdapters::MySQLAdapter
        # MySQL version...
    end
end

この問題を回避したら、次のタスクは、開発環境を PostgreSQL に切り替えて、他のすべての小さな問題 (GROUP BY の問題、大文字と小文字を区別する LIKE、列の切り捨て動作など) の修正を開始できるようにすることです。あなたが遭遇すること。

于 2012-06-30T19:24:01.703 に答える