Rails初始化程序在迁移数据库时运行。

12

非常令人惊讶的是,Rails的初始化程序在运行任何rake任务(包括db:migratedb:seed)时都会运行。

我的应用程序中的一个初始化程序启动了一个后台线程(一种工作进程),它应该只在调试和生产模式下运行时执行。

如何防止特定的初始化程序在执行rake db:migrate时运行或如何在初始化程序中检测正在运行的rake任务?


2
迁移需要加载您的环境,初始化程序是环境的一个重要组成部分。如果您需要在迁移期间不运行初始化程序,则可能放错了位置。 - Matt
3个回答

10

如果您的初始化程序依赖于特定表的创建,则可以使用ActiveRecord::Base.connection.table_exists? :mytable进行检查。


1
提醒未来的开发者,当运行 db:create 时,这种方法是不起作用的,因为 ActiveRecord::Base.connection... 会导致错误,提示数据库不存在。 - Fralcon
为了使用它并能够删除/创建数据库,只需捕获 ActiveRecord::NoDatabaseError 异常。 def initialize
begin if ActiveRecord::Base.connection.table_exists? :your_table < 一些代码会被执行..... > end rescue ActiveRecord::NoDatabaseError => exception # puts "错误......#{exception.to_s}" end end
- random_user_0891

8
以下是如何在Rake任务中防止初始化程序运行的解决方案:

以下是防止初始化器在Rake任务中运行的解决方案:

unless ( File.basename($0) == 'rake')
   # Initializer code
end

4
这显然取决于使用“rake”来调用它。如果你开始使用"rails"命令来运行rails db:migrate等操作,那么这种方法就行不通了。 - traday

1
迁移需要加载您的环境,初始化程序是环境的重要组成部分。如果您需要在迁移期间不运行初始化程序,则可能放错了位置。
如果您无法将其移到其他位置,则可以尝试使用此答案(create a 'fast migrate' rake task)来帮助解决问题。

10
马特,这个“elsewhere”是什么?要求:我需要在应用启动时运行一个线程,并且在迁移时不需要它。在哪里放置线程启动以避免处理额外的命令行参数,就像那个关于快速迁移的答案中所述的那样? - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接