【问题标题】:Guidelines about using of migrate on Rails关于在 Rails 上使用 migrate 的指南
【发布时间】:2013-01-11 10:21:12
【问题描述】:

我已经阅读了 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,我在其中手动编写了所有更改。

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

【问题讨论】:

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


    【解决方案1】:

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

    相反,您创建了一个新的迁移,它将更改、删除或添加数据库字段。

    在您的示例中,您可以将旧迁移保留在原处,然后像这样创建新迁移:

    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,一切就绪!

    【讨论】:

    • 感谢您对快捷方式的总结。出于某种原因,我在官方 3.1 文档中找不到...grr
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-07-15
        • 2020-09-20
        • 2011-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多