2

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

例如我创建了两个类:

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

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

这会创建模型、控制器、... UserHat及其迁移类: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我在其中手动编码所有更改。

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

4

3 回答 3

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 的字段添加到 users 表中,其数据类型为字符串。或者

rails g migration remove_something_from_users name

这将自动创建迁移以从用户表中删除名称字段。这些快捷方式和创建的迁移文件不需要def down-rails 将自动足够聪明地在反转时弄清楚这一点。

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

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

最终,只要运行rake db:migrate,你就会一切就绪!

于 2013-01-11T10:35:08.193 回答
1

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

于 2013-01-11T10:27:52.577 回答
0

您的问题的答案应该是替代 2。但是,如果您只想添加或删除属性,则不必全部手动完成:http: //guides.rubyonrails.org/migrations.html#creating-a-独立迁移

于 2013-01-11T10:28:54.660 回答