如何在Sidekiq worker中传递动态数据库连接?

时间:2013-10-19 21:32:22

标签: ruby-on-rails-3 sidekiq

所以我有这两个sidekiq工作者,都应该连接并将数据保存到数据库。特定数据库可以根据帐户进行更改。

以下是有效的方法:(工人中还有其他方法)

class GaDataloadProcessor < GaWorker
  attr_reader :profile, :dataload, :connection, :results

  def perform(id)
    @dataload = Dataload::GoogleAnalytics.find(id)
    connector = dataload.google_analytics_connector
    with_session(connector.username, connector.password) do
      load_profile(connector.account, dataload.profile)

      run_report

      setup_db_connection

      import_results
    end
  end

  private

  def setup_db_connection
    @connection = ActiveRecord::RdsDb.get_connection(dataload.account)
  end

我在控制台中使用有效ID启动此工作符,然后我得到:

irb(main):004:0> ga_worker.perform(2)
  Dataload::GoogleAnalytics Load (3.0ms)  SELECT "dataload_google_analytics".* FROM "dataload_google_analytics" WHERE "dataload_google_analytics"."id" = $1 LIMIT 1  [["id", 2]]
  Connector::GoogleAnalytics Load (0.7ms)  SELECT "connector_google_analytics".* FROM "connector_google_analytics" WHERE "connector_google_analytics"."id" = 7 LIMIT 1
  Account Load (1.2ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = 16 LIMIT 1
   (76.1ms)  insert into google_analytics_test2 (visitors,date) values ('4','20131018')

太棒了,按预期工作。这个工人不工作(坏工人):(工人中还有其他方法)

class CmpUpdateWorker < BaseWorker
  attr_reader :dataload, :connection

  def perform(dataload_id)
    @dataload = DataloadMailchimp.find(dataload_id)
    @gibbon = Gibbon.new(@dataload.api_key)

    setup_db_connection

    run_report
    import_results
end

private

  def setup_db_connection
    @connection = ActiveRecord::RdsDb.get_connection(dataload.account)
  end

当我从控制台执行这个工作时,我得到了这个:

irb(main):002:0> cmp_worker.perform(5)
  DataloadMailchimp Load (68.0ms)  SELECT "dataload_mailchimps".* FROM "dataload_mailchimps" WHERE "dataload_mailchimps"."id" = $1 LIMIT 1  [["id", 5]]
NoMethodError: undefined method `rds_username' for 16:Fixnum

16是正确的account_id,它在数据库中。该记录还具有正确的rds_username和其他数据库连接值。

工人中引用的两个模型都有belongs_to:account。我一直在测试并尝试缩小范围但是卡住了。我知道有比我在这里发布的代码更多的代码。我很乐意添加任何可能有助于解决这个问题的内容或访问回购。

我感谢任何建议或指示。感谢。

1 个答案:

答案 0 :(得分:0)

我通过将setup_db_connection更新为:

来运行CmpUpdateWorker
def setup_db_connection
    @connection = ActiveRecord::RdsDb.get_connection(@dataload.account)
  end