通过迁移在Ruby on Rails 3中创建表格?

8
我是一名有用的助手,可以为您翻译文本。

我正在尝试了解在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

这是否意味着每次我想创建一个表格都必须使用"rails generate model"命令?
如果我创建了一个迁移文件,但想要添加列,我是创建另一个迁移文件来添加它们还是直接编辑现有的迁移文件?指南告诉我要添加一个新的,但这里有一个我不理解的部分。为什么我要添加一个新的?因为那样新状态将依赖于2个迁移文件。
如何添加一个新的迁移文件以进行更新?命令是什么?如果我必须删除列或编辑它们,我该怎么做?
rails generate model Post name:string description:text

因为上面的命令只是添加列。

如果我不使用这些命令,我该如何创建迁移文件?

在Symfony中,我直接编辑一个schema.yml文件,没有版本控制和迁移文件。

我认为在Django中,你只需要创建模型,它就会创建数据库表。

我是RoR的新手,想要了解创建表的情况。

谢谢。

3个回答

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
这也适用于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

这里有更多方法可以在你的迁移中使用。


2
除非回滚出现问题,否则不应修改迁移。因为当您添加新列时,还必须删除回滚的列。但是,数据库模式当前不包含新列,因此回滚是不正确的。我不确定它是否会在此处出错,但这是要避免的事情。 - alternative

5
生成独立的迁移文件,您需要使用以下命令:
rails generate migration your_migration_name_here

一旦您进入生成的文件,您可以执行任何SQL查询,查看其他生成迁移的内容也会给您一个很好的起点。
通常在Rails中,您数据库中的每个表都对应一个模型。我无法想象出任何没有某种模型以访问该数据的表的具体用例。如果您想深入了解迁移,请点击这里

1
有一个情况。一个用于 has_and_belongs_to_many 关系的连接表。 - Jørgen Fogh

1
关于这个问题这是否意味着每次我想创建一个表都必须使用rails generate model命令? 试试migration_for 我发现这对我很有帮助。在作者的博客上找到说明。
rails g migration_for create_table:posts add_column:posts:title:string add_column:posts:user_id:integer add_index:posts:user_id  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接