关于在Rails上使用迁移的指南

时间:2013-01-11 10:21:13

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

我已经阅读了Rails 3(Rails 3.0 Relese Notes Migrate)上的“迁移”文档,但我有些疑惑。

e.g。我创建了两个类:

rails generate scaffold User name:string age:integer height:float

rails generate scaffold Hat type:string width:float height:float

创建模型,控制器,... 用户 Hat 及其迁移类:xxx_create_users.rb和xxx_create_hats.rb

好的,现在我们想要修改User类并删除height属性,然后添加Users和Hats之间的关系:

用户

class User < ActiveRecord::Base
  attr_accessible :name, :age

  has_many :hats
end

class Hat < ActiveRecord::Base
  attr_accessible :type, :width, height

  belongs_to :user
end

我猜的选项:

  1. 我删除了所有文件xxx_create_xxx.rb然后我将再次创建:rails generate migration CreateUser(和Hat一样)

  2. 我创建了一个新的迁移文件:rails generate migration MyNewMigration,我手工编写了所有更改。

  3. 是否有另一种方法可以自动更改类中的更改以将其传递给数据库?什么是正确的方法?

3 个答案:

答案 0 :(得分:3)

迁移的想法是你有一个严格的故事情节,你可以从任何一点开始,向后转发。这意味着不必删除迁移。

而是创建一个新的迁移,它将更改,删除或添加数据库字段。

在您的示例中,您将旧的迁移保留在原来的位置,然后创建一个新的迁移,如下所示:

rails g migration change_user_fields

def up内写下

remove_column :table_name, :column_name
change_column :table_name, :column_name, :data_type

添加def down - 每当迁移被rake db:rollback撤消时,都会运行此操作。在def down里面放了:

add_column :table_name, :column_name # add the field that you removed (s.a.)
change_column :table_name, :column_name, :data_type # change back to old data type

Rails 3为您提供了一个很好的快捷方式,可以通过执行以下操作来添加和删除表中的字段:

rails g migration add_something_to_users name:string

将自动创建一个迁移,该迁移将名为name的字段与数据类型string添加到users表中。或

rails g migration remove_something_from_users name

将自动创建迁移以从users表中删除名称字段。这些快捷方式和创建的迁移文件不需要def down - rails会自动变得足够智能,以便在反转时能够识别出来。

在这两种情况下,您都可以将“某事”一词替换为您喜欢的任何内容。

但是,我知道无法使用快捷方式更改数据类型,因此您需要进入迁移文件并手动执行此操作。

最后,只需运行rake db:migrate即可完成任务!

答案 1 :(得分:1)

Scaffold仅自动执行固定命令,因此如果使用scaffold创建模型及其属性,则迁移将仅包含您在命令行中指定的字段。没有办法自动跟踪变化 如果在数据库上添加/删除/更改某些内容,则必须手动设置它。迁移非常有用,因为您可以按时跟踪这些变化 所以我建议你永远不要删除迁移。在您描述的这种特殊情况下,您只需创建另一个以反映数据库上的新更改,总共保留3次迁移,而不是删除和创建另一次迁移。

答案 2 :(得分:0)

您的问题的答案应该是替代2.但如果您只想添加或删除属性,则无需手动完成所有操作: http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration