非常令人惊讶的是,Rails的初始化程序在运行任何rake任务(包括db:migrate
和db:seed
)时都会运行。
我的应用程序中的一个初始化程序启动了一个后台线程(一种工作进程),它应该只在调试和生产模式下运行时执行。
如何防止特定的初始化程序在执行rake db:migrate
时运行或如何在初始化程序中检测正在运行的rake任务?
非常令人惊讶的是,Rails的初始化程序在运行任何rake任务(包括db:migrate
和db:seed
)时都会运行。
我的应用程序中的一个初始化程序启动了一个后台线程(一种工作进程),它应该只在调试和生产模式下运行时执行。
如何防止特定的初始化程序在执行rake db:migrate
时运行或如何在初始化程序中检测正在运行的rake任务?
如果您的初始化程序依赖于特定表的创建,则可以使用ActiveRecord::Base.connection.table_exists? :mytable
进行检查。
db:create
时,这种方法是不起作用的,因为 ActiveRecord::Base.connection...
会导致错误,提示数据库不存在。 - FralconActiveRecord::NoDatabaseError
异常。
def initialize以下是防止初始化器在Rake任务中运行的解决方案:
unless ( File.basename($0) == 'rake')
# Initializer code
end
rails db:migrate
等操作,那么这种方法就行不通了。 - traday