ruby-on-rails - Ruby-on-rails 中的迁移问题

标签 ruby-on-rails postgresql rubymine

大家好,当我第一次开始 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,它不起作用,但没有错误。

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

最佳答案

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

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

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

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

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

关于ruby-on-rails - Ruby-on-rails 中的迁移问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3597012/

相关文章:

postgresql - 解决将 pgbackrest 作为 cron 作业运行时发现的权限问题

ruby - 如何在 ruby​​ 调试器中运行 rspec Expect 语句?

ruby-on-rails - Ruby 类中未初始化的常量错误

ruby - 检查警告 : Cannot find declaration for field

ruby-on-rails - rails 中的 create_or_update 方法

mysql - rails 使查询更好

ruby-on-rails - RSpec: stub 私有(private)方法

ruby-on-rails - 捆绑 exec rake 作业 :work

database - 将 postgres 表导出到 csv 错误

ruby-on-rails - rails - 不区分大小写的搜索条件