2010-06-13 113 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