2012-08-25 31 views
6

,比如我有這種模式:手動更新模型後更新db/migrate?

class Product < ActiveRecord::Base 
    attr_accessible :name, :order 
end 

然後當我做了rake db:migrate創造了這個DB /遷移/ 20120825132038_create_products.rb

class CreateProducts < ActiveRecord::Migration 
    def change 
    create_table :products do |t| 
     t.integer :order 
     t.string :name 

     t.timestamps 
    end 
    end 
end 

但是這一切happend因爲我使用rails generate Product order:integer name:string

現在我進入產品型號並手動更改爲:

class Product < ActiveRecord::Base 
    attr_accessible :name, :order, :category_id 

    validates :name, uniqueness: true 
    belongs_to :category 
end 

如何使用更新自動更新db/migrate/20120825132038_create_products.rb

回答

17

當您運行rake db:migrate時,它沒有創建db/migrate/20120825132038_create_products.rb。當您運行

rails generate Product order:integer name:string 

attr_accessible無關與遷移數據庫,移民文件被創建。

我強烈建議你讀Migrations Rails的指南,以及其中討論attr_accessibleMass Assignment部分。

要生成遷移文件(因爲在你的問題中提到的一個已經被你所提到的運行以前rake db:migrate命令處理),運行

rails g migration AddCategoryIdToProduct category_id:integer 

這將產生一個新的像內容遷移

class AddCategoryIdToProduct < ActiveRecord::Migration 
    def change 
    add_column :products, :category_id, :integer 
    end 
end 

運行rake db:migrate再次現在將處理此mig配給文件,將新的category_id整數列添加到您的products表中。

+0

感謝您的偉大的消除! 但每次我想添加一個屬性/屬性(無論你怎麼稱呼它)到一個模型中,我需要使用rails g migration並創建一個新類? – Danpe

+0

如果遷移已經應用到數據庫,** yes **。模型只不過是一個可以與數據庫進行交互的界面。它不會操縱數據庫的**結構**;這就是遷移的目的。將一列添加到表格中會自動使相關模型中的新屬性方法可用。 – deefour

+0

是的。始終創建新的遷移 - 即使只有一列。永遠不要回頭編輯舊的遷移。這是一個好習慣! 相信我,你未來的同事會感謝我確保你遵循這種做法。 –

6

您可以通過運行

rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration 

您還可以重做重做遷移遷移(運行上下,但只有當你有一個向上和向下的作品,你會不會當你只是在一個變化)

rake db:migrate:redo