2015-02-08 45 views
0

例如,我有上崗遷移文件:如何將db結構更改遷移到heroku postgres?

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節,但它沒有指定如何傳遞它們。

謝謝!

+0

噢,除了最後一個例子,它會讀't.integer:ip',然後只有在下面纔會在change_column中設置限制嗎?謝謝! – Laser 2015-02-08 03:04:45

回答

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 

在Heroku:

heroku run rake db:migrate 

希望有所幫助。

+0

啊我幾乎到了這裏,但錯過了,我不得不重新指定整數類型,不能只是通過修飾符。無論如何,應用一個實際的例子讓我感覺非常棒,因此我現在對遷移有了一些直觀的理解,將他們的狀態從我存在的某個地方改變到了非常好的狀態:P非常感謝喬丹! – Laser 2015-02-08 04:44:40