2010-06-13 114 views
8

即時通訊試圖瞭解在紅寶石軌道3創建表的過程。通過遷移在ruby-on-rails 3中創建表?

我已閱讀有關遷移。所以我認爲通過在文件編輯創建表:

Database Migrations/migrate/20100611214419_create_posts 
Database Migrations/migrate/20100611214419_create_categories 

但他們所產生的:

rails generate model Post name:string description:text 
rails generate model Category name:string description:text 

這是否意味着我必須使用「軌道生成模式」命令,每次我想創建一個表?

如果我創建遷移文件但想要添加列,該怎麼辦。我是否要創建另一個遷移文件來添加這些文件,還是直接編輯現有的遷移文件?該指南告訴我要添加一個新的,但這裏是我不明白的部分。我爲什麼要添加一個新的?導致那麼新的狀態將取決於2個遷移文件。

以及如何添加新的遷移文件進行更新?命令是什麼?如果我必須刪除列或編輯它們。它是如何做到的?

rails generate model Post name:string description:text 

導致上述命令只是添加列。

如果我不使用這些命令,我​​該如何創建遷移文件?

在symfony中,我只是直接編輯schema.yml文件,沒有使用版本控制等的遷移文件。

我想在django中你只是創建模型,它會創建數據庫表。

即時通訊新的和想要獲得創建表的圖片。

感謝

回答

11

如果您要更新表,您必須創建新的遷移文件,因爲每個遷移在數據庫上只執行一次。因此,如果您已經有posts表格,那麼在修改create_posts遷移之後,您將無法再運行它。

您可以回滾遷移,然後再次運行它們。這將解決問題,但它也會破壞表和它可能保存的數據。如果您只是創建了遷移,然後發現您錯過了一列,這不是問題。然後,您可以將該列添加到遷移,回滾和遷移。但你不想在生產數據庫上這樣做!

要創建一個新的遷移,你只要運行:

rails generate migration migration_name 

如果你打電話給遷移add_*_to_table那麼你也可以通過相同的參數在generate model

rails generate migration add_something_to_posts something:boolean 

這會自動生成該遷移:

class AddSomethingToPosts < ActiveRecord::Migration 
    def self.up 
    add_column :posts, :something, :boolean 
    end 

    def self.down 
    remove_column :posts, :something 
    end 
end 

This將與remove_*_from_table工作過:

rails generate migration remove_something_from_posts something:boolean 

遷移將是:

class RemoveSomethingFromPosts < ActiveRecord::Migration 
    def self.up 
    remove_column :posts, :something 
    end 

    def self.down 
    add_column :posts, :something, :boolean 
    end 
end 

這裏有some more methods,你可以在你的遷移使用。

+2

除非回滾中斷,否則不應在回滾之前修改遷移。因爲在添加新列時,還必須刪除回滾列。但是,數據庫模式當前不包含新列,因此回滾不正確。我不確定它是否在這個錯誤上,但是它是避免的。 – alternative 2010-06-13 11:39:19

5

要生成獨立的遷移文件,您將使用:

rails generate migration your_migration_name_here 

一旦你去生成的文件,你可以執行任何你喜歡的SQL,看着對方產生遷移將給你一個很好的起點。

通常在Rails中,您爲數據庫中的每個表都有一個模型。我想不出任何具體的用例,你會有一個沒有某種模型的表來訪問這些數據。如果您想深入瞭解遷移,請轉至here

+1

有一種情況。 has_and_belongs_to_many關係的連接表。 – 2012-02-20 09:28:24

1

關於這個問題這是否意味着我每次要創建表時都必須使用rails generate model命令?

嘗試migration_for
我覺得這對我很有幫助。找到說明author's blog

rails g migration_for create_table:posts add_column:posts:title:string add_column:posts:user_id:integer add_index:posts:user_id