Rails 模型验证器破坏了早期的迁移
-
09-06-2019 - |
题
我在 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
不隶属于 StackOverflow