Rails —了解db:migrate

| 我在理解Ruby on Rails中的迁移时遇到了一些麻烦。我的应用程序的“ 0”目录中有以下两个类(存储在单独的文件中):
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

class AddEmailUniquenessIndex < ActiveRecord::Migration
  def self.up
    add_index :users, :email, :unique => true
  end

  def self.down
    remove_index :users, :email
  end
end
我对这两个文件似乎如何一起运行感到困惑。创建第二个类后,Michael Hartl的书说:“我们可以编辑users表的迁移文件,但这需要先回滚然后再迁移。Rails的方式是每次我们发现我们的数据模型需要更改。\“这些迁移实际上如何工作?迁移数据库时,目录中的所有文件都运行吗?就像这里幕后发生的事情一样?     
已邀请:
        按照惯例,这些迁移类的文件名将以创建它们的时间的时间戳表示形式为前缀(例如20110611000000)。当您运行db:migrate时,rails将检查数据库中的特殊表,该表包含上一次应用于数据库的迁移的时间戳。然后,它将在该日期之后应用带有时间戳的所有迁移,并使用上一次迁移的时间戳更新数据库表。结果,每个迁移类仅一次应用于数据库。 迈克尔·哈特(Michael Hart)说明,如果将所有迁移都放在一个文件中,Rails将很难/不可能的时间告诉您已应用了哪些迁移,未应用了哪些迁移。此时唯一的选择是删除数据库中的所有表,并从头开始进行所有迁移。从功能上讲可以,但是您将丢失所有数据。最好只向“前进”方向移动,而不是返回到起点然后再向前移动。     
        这些迁移实际上如何工作? db:migrate是一项rake任务。 db:migrate任务(内置的Rails支持程序)将搜索您项目的db / migrate目录,并使用其中的文件来更新数据库的架构。 迁移数据库时,目录中的所有文件都运行吗?否。当在命令行上键入\“ rake db:migrate \”时,仅运行新的db / migrate文件(自上次运行db:migrate命令以来添加的文件)。 这意味着修改任何数据库/迁移文件是一个坏主意(不是Rails-way)。而是添加一个新文件。 就像这里幕后发生的事情一样? Rails和db:migrate机制如何跟踪项目的db版本取决于Rails的版本。 补充:这是一些有关如何秘密进行迁移的好信息。     
        将每个文件视为一组可以运行一次的指令。基本上,rake db:migrate任务将加载迁移对象并在其上运行.up()。如果您已经运行了迁移,那么更改文件将不再起作用-迁移已经运行。但是,更改迁移会使您的应用程序的其他用户放弃。因此,不要更改旧的迁移,创建新的迁移,然后只运行一次。 由于迁移类仅执行一次,因此您实际上可以删除旧的迁移文件,但是从那时起,如果您重置数据库,则需要先运行rake db:setup,然后再运行rake db:migrate(基本上,数据库会需要首先从schema.rb文件中加载,因为您的迁移将不再包括使数据库达到最终状态所需的所有步骤。这些文件不会占用很多空间,因此通常只需保留它们就更简单了。     
        它基本上是SQL接口的程序化前端。它使您不必直接与数据库进行交互,并确保您也可以使用任何数据库类型(mySQL,SQLite,PostOgre)     

要回复问题请先登录注册