我的迁移引用了一个不存在的类:
class AddDataToUsers < ActiveRecord::Migration[4.2]
def up
UsersService.load_data
end
def down
User.delete_all
end
end
UsersService已删除,但我仍有此旧迁移引用它。
开发者无法从现在开始运行迁移。我应该如何处理它来修复我的迁移?
我已经尝试更改旧的迁移文件来检查是否定义了UserService
类,但我不确定这是否是一个好的做法。
2条答案
按热度按时间e5njpo681#
1.**创建缺少的类:**如果您迁移引用的类是模型、控制器或您打算创建的任何其他类,则在应用程序的正确目录中创建类文件。
2.**删除迁移:**如果迁移所引用的类不存在于应用程序中或已被删除,则可以删除导致错误的迁移。
您可以从db/migrate目录中手动删除迁移文件,也可以使用以下命令删除迁移文件。
3.**回滚迁移:**如果您已经运行了引用不存在类的迁移,则可以回滚迁移并修复问题。
您可以通过运行以下命令回滚上次迁移:
这将还原上次运行的迁移。修复问题后,可以通过运行以下命令重新运行迁移:
b4lqfgs42#
作为一个最佳实践,你不应该在迁移中引用模型。如果你需要加载/修改/删除数据,你应该为它创建一个rake任务,而不是迁移。
在您的例子中,由于错误已经发生,您必须以某种方式进行补救。由于在这种特殊情况下,您似乎正在将数据加载到一个不再存在的表中,因此删除此迁移或注解引用不存在模型的行应该是安全的。
请记住,在不同的问题情况下,“正确的做法”是不同的。
@spickermann说的没错,你可以删除那些到处运行的依赖于
db/schema.rb
文件的旧迁移。然而,我更喜欢将旧迁移“压缩”到一个文件中,这样可以获得同样的速度优势,但不会破坏Rails对db:migrate
从临时数据库工作的期望。