【发布时间】:2016-06-03 18:47:29
【问题描述】:
我在我的 Rails 应用程序中进行了迁移,我希望仅在运行特定 rake 任务时才运行该迁移,否则我会丢失大量数据。以下是我想做的事情:
if has_rake_task_been_run?
remove_column :transactions, :paid_by
end
目前,我无论如何都找不到,而不是手动确保这件事。有什么解决办法吗?
【问题讨论】:
-
这味道很重。为什么迁移依赖于 rake 任务?您的架构不应依赖于您的代码。上面提到的 rake 任务负责什么?
-
除非您将该信息存储在某处,否则您无法知道它是否已运行。就像您从任务中写入的文件或数据库,然后签入迁移。我假设在删除列之前需要 rake 任务来迁移数据?也许您可以在纯 SQL 中检查(即如果列不为空或类似)?然后才删除列?这将使您的迁移“独立”
-
@BroiSatse 我正在删除迁移中的一列,但在删除该列之前,我需要复制该列中的值,并填充一个新列。这就是为什么我需要在触发迁移之前确保任务已经运行。
-
@BilalMaqsood - 在这种情况下,将代码从您的任务移动到您的迁移 - 这称为数据迁移并且非常常见。 Rake 任务主要用于可重复的任务。另请注意,即使您设法在迁移中对其进行检查,迁移也会被标记为已执行,并且即使您的 rake 任务稍后完成也不会再次运行。
-
@pascalbetz 是的,这是有道理的。我将检查所需任务已通过 ruby 代码运行的迁移,然后让迁移运行。
标签: ruby-on-rails ruby ruby-on-rails-4 rake rake-task