5

我在 Rails 应用程序中有一系列迁移,其中包括以下步骤:

  1. 创建“用户”模型的基本版本
  2. 创建此模型的实例 - 我的系统中至少需要一个初始用户,以便您可以登录并开始使用它
  3. 更新“用户”模型以添加新字段/列。

现在我在这个新字段/列上使用“validates_inclusion_of”。这在我最初的开发机器上运行良好,它已经有一个应用了这些迁移的数据库。但是,如果我转到一台新机器并运行所有迁移,则第 2 步将失败,因为 validates_inclusion_of 失败,因为尚未将迁移 3 中的字段添加到模型类中。

作为一种解决方法,我可以注释掉“validates_...”行,运行迁移,然后取消注释,但这并不好。

最好重新排序我的迁移,以便在添加所有列之后最后创建用户(步骤 2)。

不过,我是一个 Rails 新手,所以我想我会问处理这种情况的首选方法是什么:)

4

4 回答 4

5

避免此问题的最简单方法是rake db:schema:load在第二台机器上使用,而不是 db:migrate。rake db:schema:load使用 schema.rb 加载最新版本的架构,而不是从头开始迁移它。

如果在部署到生产机器(保留数据很重要)时遇到此问题,您可能必须将迁移合并到一个文件中而不会发生冲突。

于 2008-09-15T10:55:59.140 回答
5

您可以在迁移中声明一个具有相同名称的类,它将覆盖您的应用程序/模型之一:

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

  def self.up
    # User.create(:name => 'admin')
  end

end

不幸的是,您的 IDE 可能会尝试基于此类(Netbeans 会)自动完成,并且您不能在其中使用您的模型逻辑(除非您复制它)。

于 2008-09-15T13:52:45.723 回答
0

我现在必须这样做。根据 BiHi 的建议,我手动加载模型,然后在需要的地方重新定义方法。

load(File.join(RAILS_ROOT,"app/models/user.rb"))
class User < ActiveRecord::Base
  def before_validation; nil; end # clear out the breaking before_validation
  def column1; "hello"; end       # satisfy validates_inclusion_of :column1
end
于 2009-09-23T04:29:16.397 回答
0

在您的迁移中,您可以保存您的用户跳过 ActiveRecord 验证:

class YourMigration < ActiveRecord::Migration

  def up
    user = User.new(name: 'admin')
    user.save(validate: false)
  end

end
于 2020-07-15T20:52:13.007 回答