Ruby on rails 如何知道rake任务已经在rails中运行?
我在我的Rails应用程序中有一个迁移,我只想在特定的rake任务已经运行的情况下运行,否则我会丢失大量数据。以下是我想做的事情:Ruby on rails 如何知道rake任务已经在rails中运行?,ruby-on-rails,ruby,ruby-on-rails-4,rake,rake-task,Ruby On Rails,Ruby,Ruby On Rails 4,Rake,Rake Task,我在我的Rails应用程序中有一个迁移,我只想在特定的rake任务已经运行的情况下运行,否则我会丢失大量数据。以下是我想做的事情: if has_rake_task_been_run? remove_column :transactions, :paid_by end 目前,我无法找到,而不是手动保证这件事。有什么解决办法吗?使用rake任务进行数据迁移是一个非常危险的想法。不这样做的两个原因: 即使您设法找出您的rake任务是否已完成,您的迁移仍将标记为已完成,并且您将无法重播它。唯一的
if has_rake_task_been_run?
remove_column :transactions, :paid_by
end
目前,我无法找到,而不是手动保证这件事。有什么解决办法吗?使用rake任务进行数据迁移是一个非常危险的想法。不这样做的两个原因:
rakedb:migrate
执行所有迁移
paid\u by
过去是字符串,而您将其更改为paid\u by\u id
,它引用了用户):
class YOURMIGRATIONNAME
使用上述代码的唯一缺点是,如果这些模型中的任何一个使用STI,它都不会很好地工作(我犯过一次错误,花了一段时间才发现问题所在)。解决方法是在迁移类之外定义它,但是这些类在所有迁移中都是可用的,并且可能会受到实际模型代码的影响(特别是在所有模型都已预加载的生产环境中)。简而言之,使用STI进行数据迁移是我目前仍在研究的问题。使用rake任务进行数据迁移是一个非常危险的想法。不这样做的两个原因:
rakedb:migrate
执行所有迁移
paid\u by
过去是字符串,而您将其更改为paid\u by\u id
,它引用了用户):
class YOURMIGRATIONNAME
使用上述代码的唯一缺点是,如果这些模型中有任何一个使用STI(我疯了),它将无法正常工作
class YOURMIGRATIONNAME < ActiveRecord::Migration
class Transaction < ActiveRecord::Base
belongs_to :paid_by, class_name: "User"
end
class User < ActiveRecord::Base
end
def up
add_column :transaction, :paid_by_id, :integer
Transaction.transaction do # for speed
Transaction.find_each do |t|
t.paid_by_id = User.find_by(username: t[:paid_by])
t.save! # Always banged save in migration!
end
end
remove_column :paid_by
end
def down
add_column :transaction, :paid_by, :string
Transactions.transaction do
Transaction.find_each do |t|
t[:paid_by] = t.paid_by && t.paid_by.username
t.save!
end
end
remove_column :transactions, :paid_by_id
end