你能在Rails迁移中创建一个"临时"模型吗?

ist*_*sci 5 model ruby-on-rails rails-migrations

我有一个Rails 2项目,通过连接表有很多关系.让我们把表A,B,和ABJ,其中ABJ具有性能a_idb_id(连同不相干到这-问题id{created,updated}_at).

我想做的事

不幸的是,这种关系从一开始就被错误地创建,应该只是一个多(A has_many B's,B belongs_to A).所以我创建了一个向上迁移,将B直接重新关联到A. 基本上,1)add_column a_id到B,2)为每个ABJ,把abj.a.id放到abj.b.a_id,3)drop_table:abj.这很好用.

我还在向下迁移中创建了"逆"操作,如果我需要为每个B创建(1)create_table abj,2),则创建一个新的abj,使得abj.a_id = b.a_id和abj.b_id = b .id,3)从B)中删除_column a_id.这也很好.

问题

随着"重新关联"这种关系与一个多的关系,期望不再使用的连接资源ABJ将消失,即删除模型,控制器,测试等.问题是,如果我这样做需要返回,运行向下迁移将无法工作,因为在步骤2(对于每个B,创建一个新的abj),class ABJ < ActiveRecord::Base自从我删除模型后就不再有了.

那么,为了操纵数据库中的数据,有没有办法在迁移中制作"临时"模型?或者您是否只是要求运行迁移的人在运行之前确定该模型是否存在?因为如果在步骤2中向下迁移失败,则步骤1已经创建了abj表,然后您必须手动删除它或在迁移中注释掉第1步代码,然后再次运行它(然后取消注释它) ).

想知道是否有任何好的解决方案.

Tom*_*m L 6

您可以在迁移中定义模型.只需将准系统定义放在迁移的顶部:

class Pancake < ActiveRecord::Base; end
Run Code Online (Sandbox Code Playgroud)

如果您正在丢弃一个表,您需要注意,当煎饼表不存在时,您不会在Pancake上调用方法.