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

Pri*_*iya 5 ruby-on-rails rails-migrations

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

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

从UI创建管理员用户时,无需更改旧的迁移,也无需进行验证,是否有可能克服这种情况

Arp*_*han 5

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

假设您有一个模型,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
Run Code Online (Sandbox Code Playgroud)


Pie*_*s C 2

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