由于新列的模型验证,Rails旧迁移失败

时间:2018-04-22 07:28:26

标签: ruby-on-rails rails-migrations

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

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

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

2 个答案:

答案 0 :(得分:4)

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

假设您有一个模型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

答案 1 :(得分:1)

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