【问题标题】:Migration issue in Ruby-on-railsRuby-on-rails 中的迁移问题
【发布时间】:2010-08-29 23:23:12
【问题描述】:

大家好,当我第一次开始一个 Rails 项目时,模型用户是设计和创建的。在完成所有迁移部分之后,它成功地在 postgres 上创建了表“users”。 好吧,然后在项目期间进行了一些更改后,我意识到表格中缺少一个属性/新列。

所以我所做的就是从 postgres 中删除表 users 并在我的第一个迁移 ruby​​ 类中添加一个新列:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :email
      t.string :authorization_token //this is the new attribute that I insert
      t.datetime :created_at
      t.datetime :updated_at

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

所以,当我再次运行 db:migrate 时,将使用新属性 :authorization_token 创建一个新的用户表,它不起作用,但没有错误。

(我知道我不应该删除表格,还有另一种聪明的方法)

【问题讨论】:

    标签: ruby-on-rails postgresql rubymine


    【解决方案1】:

    使用 Rails 的提示——不要使用 SQL 手动修改表。当您看到问题时,您应该编写一个像 @nruth 所示的新迁移。运行 rake:migrate 命令对您来说效果很好。

    在这种情况下,由于您已经删除了“用户”表,您现在遇到的问题是您的数据库架构与 Rails 认为的不同步。要解决此问题,您可以通过手动创建“用户”表、运行向下迁移然后向上迁移来使数据库模式大致匹配 Rails 认为的模式。或者,您可以让 Rails 加快速度,因为“用户”表不再存在。 Rails 将迁移信息存储在 schema_info 表 (Rails = 2.1) 中。如果您删除该表,Rails 将认为该架构不存在并尝试运行所有向上迁移并再次为您重新创建“用户”表。

    最后,随着时间的推移,您可能会累积大量迁移,这些迁移会单独添加一两列您忘记包含的列。如果您还没有发货或尚未投入生产,那么您可以编写一个迁移来为您的表设置基线。它看起来像这样:

    class CreateBaselineUsers < ActiveRecord::Migration
      def self.up
        create_table :users, :force => true do |t|
          t.string :name
          ...
    

    这将强制删除表并使用您想要的所有属性重新创建它。

    【讨论】:

      【解决方案2】:

      迁移运行一次并存储在数据库中(查看 schema_migrations 表)。您可以尝试使用 rake db:migrate:reset 重新运行初始迁移,但最好只添加新的迁移(当数据库中有数据时,您不会想炸毁数据库),如下所示:

      脚本/生成迁移 add_authorization_token_to_users 授权令牌:字符串

      这将生成类似于以下内容的内容:

      class AddAuthorizationTokenToUsers < ActiveRecord::Migration
        def self.up
          change_table :users do |t|
            t.string :authorization_token //this is the new attribute that I insert
          end
        end
      
        def self.down
          remove_column :users, :authorization_token
        end
      end
      

      要了解添加/删除列、change_table 等如何工作,请查看 http://api.rubyonrails.orghttp://guides.rubyonrails.org/migrations.html 上的 ActiveRecord::ConnectionAdapters::SchemaStatements

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 2015-04-09
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        相关资源
        最近更新 更多