Kva*_*ass 2 ruby data-migration ruby-on-rails-3
我在理解Ruby on Rails中的迁移时遇到了一些麻烦.我的应用程序db\migrate\目录中有以下两个类(存储在单独的文件中):
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
Run Code Online (Sandbox Code Playgroud)
我很困惑这两个文件似乎是如何一起运行的.在创建第二个类时,Michael Hartl的书说"我们可以编辑用户表的迁移文件,但这需要回滚然后再迁移.Rails方法是每当我们发现我们的数据模型需要时使用迁移改变." 这些迁移实际上如何运作?迁移数据库时是否运行目录中的所有文件?就像这里的幕后情况一样?
按照惯例,这些迁移类的文件名将以创建它们的时间戳表示为前缀(例如20110611000000).运行db:migrate时,rails将检查数据库中的特殊表,该表包含应用于数据库的上次迁移的时间戳.然后,它将在该日期之后应用具有时间戳的所有迁移,并使用上次迁移的时间戳更新数据库表.因此,每个迁移类只应用一次到数据库.
迈克尔·哈特表示,如果你把所有的迁移到一个单一的文件,轨道将有哪些迁移已被应用,哪些早已不是硬/不可能报时.此时唯一的选择是删除数据库中的所有表,并从头开始运行所有迁移.功能上有效,但你会丢失所有数据.最好只在"前进"方向上移动而不是从开始然后再向前移动.
这些迁移实际上如何工作?
db:migrate是一项rake任务。db:migrate任务(内置的Rails支持程序)将搜索您项目的db / migrate目录,并使用其中的文件来更新数据库的架构。
迁移数据库时,目录中的所有文件都运行吗?否。在命令行上键入“ rake db:migrate”时,仅运行新的db / migrate文件(自上次运行db:migrate命令以来添加的文件)。
这意味着修改任何数据库/迁移文件是一个坏主意(不是Rails-way)。而是添加一个新文件。
像这里幕后发生的事情一样?Rails和db:migrate机制如何跟踪项目的db版本取决于Rails的版本。
补充:这是一些有关如何秘密进行迁移的好信息。
| 归档时间: |
|
| 查看次数: |
2991 次 |
| 最近记录: |