【问题标题】:Rails old migrations fail due to validation in model for new column由于新列的模型验证,Rails 旧迁移失败
【发布时间】:2018-04-22 07:28:26
【问题描述】:

我有一个应用程序在生产中使用活动管理员和设计。我尝试将user_role 添加到表admin_users。我还想验证在创建新管理员用户时是否选择了角色名称。所以我在 rails 模型中添加了validates :role_id, :presence => true

当我在旧数据库上运行新迁移时,一切正常。但是当我尝试从头开始应用迁移时,创建管理员用户的旧迁移失败,因为模型中添加了验证,说未定义方法错误。

在不更改旧迁移并通过从 UI 创建管理员用户时进行验证,是否有可能克服这种情况

【问题讨论】:

    标签: ruby-on-rails rails-migrations


    【解决方案1】:

    我遇到了这个问题,对我来说最好的解决方案似乎是修改迁移中的模型并通过打开模型的类来删除有问题的验证(在迁移期间)。

    假设您有一个模型 Employee 并且对列 firstname 的验证干扰了特定迁移。假设您使用的是 Rails 4.2,这应该可以工作:

    class CreateStoreFromPreferences < ActiveRecord::Migration
      def change
        Employee.class_eval do
          _validators.delete(:firstname)
    
          _validate_callbacks.each do |callback|
            if callback.raw_filter.respond_to? :attributes
              callback.raw_filter.attributes.delete :firstname
            end
          end
        end
    
        # actual migration code goes here
      end
    end
    

    【讨论】:

    • 这非常有帮助,谢谢 Arpit - 对我来说效果很好
    • 谢谢,顺便说一句,您使用的是什么版本的 Rails?这将有助于当前用户,因为大多数人现在使用 5 或 6。
    • 我使用的是 Rails 5.2,上面的代码对我有用
    【解决方案2】:

    一般来说,不,不能保证旧的迁移会随着模型的发展而保持可重用性。如果您需要重建测试或开发数据库,​​请使用rake db:schema:loadGoogle 这个命令,您会发现几篇不错的文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      相关资源
      最近更新 更多