Rails模型验证器打破了早期的迁移

时间:2020-03-05 18:53:12  来源:igfitidea点击:

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

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

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

作为一种解决方法,我可以注释掉" validates _..."行,运行迁移,然后取消注释,但这不是很好。

最好是对迁移进行重新排序,以便在添加所有列之后,最后一次创建用户(步骤2)。

我虽然是Rails新手,所以我想问一下处理这种情况的首选方法是:)

解决方案

回答

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

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

回答

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

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

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

end

不幸的是,IDE可能会尝试基于此类自动完成(Netbeans会这样做),并且我们无法在其中使用模型逻辑(除非我们重复了模型逻辑)。

回答

我现在必须这样做。根据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