如何将db结构更改迁移到heroku postgres?

时间:2015-02-08 03:02:45

标签: ruby-on-rails postgresql ruby-on-rails-4 heroku

例如,我有一个帖子的迁移文件:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.text :text
      t.integer :ip

      t.timestamps
    end
  end
end

并希望将其更改为:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.text :text
      t.integer :ip, :limit => 8

      t.timestamps
    end
  end
end

我会添加一行:

change_column :posts, :ip, :limit => 8

以下文件为:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.text :text
      t.integer :ip, :limit => 8

      t.timestamps
      change_column :posts, :ip, :limit => 8
    end
  end
end

然后运行heroku run rake --trace db:migrate

我无法理解迁移的工作原理,尤其是生产,因此非常感谢任何帮助。

http://guides.rubyonrails.org/active_record_migrations.html#changing-columns列修饰符的第3.5节,但没有指定如何传递它们。

谢谢!

1 个答案:

答案 0 :(得分:1)

您应该创建一个单独的迁移,以便在ip列上添加限制。

生成迁移:

rails generate migration ChangeIpLimitOnPosts

在生成的迁移文件中,更新内容:

class ChangeIpLimitOnPosts < ActiveRecord::Migration
  def up
    change_column :posts, :ip, :integer, limit: 8
  end

  def down
    change_column :posts, :ip, :integer
  end
end

请注意:您需要在更改列时指定列类型,即使在您的情况下,您也不会更改类型。

此外,在这种情况下,如果您需要回滚,Active Record将不知道如何撤销事务,因此您需要明确告诉Active Record如何执行此操作 - 这可以使用updown方法,而不是change

运行迁移:

rake db:migrate

On Heroku:

heroku run rake db:migrate

希望有所帮助。