我已经阅读了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
我猜的选项:
我删除了所有文件xxx_create_xxx.rb然后我将再次创建:rails generate migration CreateUser
(和Hat一样)
我创建了一个新的迁移文件:rails generate migration MyNewMigration
,我手工编写了所有更改。
是否有另一种方法可以自动更改类中的更改以将其传递给数据库?什么是正确的方法?
答案 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