ruby 当我的迁移引用了一个不存在的类时,我该怎么办?

7y4bm7vi  于 2023-04-11  发布在  Ruby
关注(0)|答案(2)|浏览(95)

我的迁移引用了一个不存在的类:

class AddDataToUsers < ActiveRecord::Migration[4.2]
  def up
    UsersService.load_data
  end

  def down
    User.delete_all
  end
end

UsersService已删除,但我仍有此旧迁移引用它。
开发者无法从现在开始运行迁移。我应该如何处理它来修复我的迁移?
我已经尝试更改旧的迁移文件来检查是否定义了UserService类,但我不确定这是否是一个好的做法。

e5njpo68

e5njpo681#

1.**创建缺少的类:**如果您迁移引用的类是模型、控制器或您打算创建的任何其他类,则在应用程序的正确目录中创建类文件。
2.**删除迁移:**如果迁移所引用的类不存在于应用程序中或已被删除,则可以删除导致错误的迁移。
您可以从db/migrate目录中手动删除迁移文件,也可以使用以下命令删除迁移文件。

rails destroy migration <migration_name>

3.**回滚迁移:**如果您已经运行了引用不存在类的迁移,则可以回滚迁移并修复问题。
您可以通过运行以下命令回滚上次迁移:

rails db:rollback

这将还原上次运行的迁移。修复问题后,可以通过运行以下命令重新运行迁移:

rails db:migrate
b4lqfgs4

b4lqfgs42#

作为一个最佳实践,你不应该在迁移中引用模型。如果你需要加载/修改/删除数据,你应该为它创建一个rake任务,而不是迁移。
在您的例子中,由于错误已经发生,您必须以某种方式进行补救。由于在这种特殊情况下,您似乎正在将数据加载到一个不再存在的表中,因此删除此迁移或注解引用不存在模型的行应该是安全的。
请记住,在不同的问题情况下,“正确的做法”是不同的。
@spickermann说的没错,你可以删除那些到处运行的依赖于db/schema.rb文件的旧迁移。然而,我更喜欢将旧迁移“压缩”到一个文件中,这样可以获得同样的速度优势,但不会破坏Rails对db:migrate从临时数据库工作的期望。

相关问题