【问题标题】:Rails initializers are running while migrating databaseRails 初始化程序在迁移数据库时运行
【发布时间】:2014-07-30 22:31:52
【问题描述】:

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

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

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

【问题讨论】:

  • 迁移需要加载你的环境,初始化器是环境的一个组成部分。如果您需要在迁移期间不运行初始化程序,那么它可能在错误的位置。

标签: ruby-on-rails database-migration initializer


【解决方案1】:

如果您的初始化程序依赖于特定表的创建,另一种方法是使用ActiveRecord::Base.connection.table_exists? :mytable 进行检查。

【讨论】:

  • 提醒未来的人们,在运行db:create 时这不起作用,因为ActiveRecord::Base.connection... 将导致错误,抱怨数据库不存在。
【解决方案2】:

这是一个如何防止初始化程序在 Rake 任务中运行的解决方案:

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

【讨论】:

  • 显然依赖于用“rake”调用它。如果您开始对命令rails db:migrate 或类似命令使用“rails”,这将不起作用。
【解决方案3】:

迁移需要加载您的环境,初始化程序是环境不可或缺的一部分。如果您需要在迁移期间不运行初始化程序,那么它可能在错误的位置。

如果您无法将其移至其他地方,那么这个答案 (create a 'fast migrate' rake task) 可能会有所帮助。

【讨论】:

  • 马特,这个“其他地方”是什么?要求:我需要在应用程序启动时运行一个线程,迁移时不需要它。在哪里放置线程开始不必处理额外的命令行参数,就像关于快速迁移的答案一样?
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2019-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多