【问题标题】:How can I force delayed_job to use a specific db connection?如何强制delayed_job 使用特定的数据库连接?
【发布时间】:2011-09-22 16:05:07
【问题描述】:

我有一个 Rails 3 应用程序,它根据子域使用不同的数据库。我通过在 ApplicationController 中使用“建立连接”来做到这一点。

现在我正在尝试使用delayed_job gem 进行一些后台处理,但是它使用了当时处于活动状态的数据库连接。它正在连接到子域数据库。

我想强制它使用“通用”数据库。我已经为一些在模型中调用“建立连接”的模型做了这个,如下所示:

class Customer < ActiveRecord::Base
  establish_connection ActiveRecord::Base.configurations["#{Rails.env}"]
  ...
end

知道我该怎么做吗?

【问题讨论】:

  • 我们遇到了完全相同的问题。很想得到回应。顺便说一句,JAG,你用什么来做基于子域的多租户?我们正在开发一个 gem,希望能提供一些意见。
  • 我自己推出了自己的产品,因为我没有找到适合我需要的东西。基本上我有一个'setup_subdomain' before_filter 可以切换到适当的数据库。我很想看看你的宝石,有链接吗?
  • @JAG,我们仍在努力,但您可以在 github github.com/bradrobertson/apartment 上玩弄它。如果您使用 Postgres,它非常可靠,SQLite 和 MySQL 在理论上可以工作,但我们还没有真正测试过它们。

标签: ruby-on-rails-3 delayed-job


【解决方案1】:

这是您需要知道的。当您在应用程序中包含 DelayedJob gem 时,您会为其创建迁移以创建存储作业的表,但您不会创建模型。这是因为 DelayedJob 已经有一个模型包含在 gem 中(即Delayed::Job)。您需要做的是稍微修补此模型,就像您对自己的模型所做的那样。您可以在初始化程序中执行此操作。

您可能已经有一个初始化程序来配置 DelayedJob,如果有,您可以在其中执行此操作,如果没有,您需要创建一个。所以,创建你的初始化器(在config/initializers),如果你没有,我们称之为delayed_job_config.rb,现在添加以下内容:

Delayed::Job.class_eval do
  establish_connection ActiveRecord::Base.configurations["#{Rails.env}"]
end

我们对 DelayedJob 模型所做的事情与您对自己的模型所做的事情相同。现在,DelayedJob 将使用该连接将作业放入数据库中。

【讨论】:

  • 你发布这个已经有一段时间了,但我根本无法让它工作?我已经完全按照您上面所说的做了,重新启动了我的网络服务器,但 DJ 仍然将作业保留在我当前环境的数据库中,而不是我在配置文件中指定的内容。也不知道怎么调试。
  • 我猜答案有点不清楚,但这条线establish_connection ActiveRecord::Base.configurations["#{Rails.env}"] 将使您延迟的工作只遵循您当前的环境,因为默认情况下会这样做,您需要将Rails.env 替换为任何内容你真正想要的数据库连接,例如establish_connection ActiveRecord::Base.configurations["common"]
  • 很好的解释。你应该写教程! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2016-03-12
  • 2018-08-31
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多