所以我有这两个 sidekiq 工作人员,他们都应该连接到数据库并将数据保存到数据库。具体的数据库可以根据Account改变。
这是一个有效的方法:(worker中还有其他方法)
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')
太棒了,按预期工作。这个worker不工作(bad worker):(而且worker中还有其他方法)
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。我一直在测试并试图缩小范围,但被卡住了。我知道这里的代码比我在这里发布的要多得多。我很高兴将任何可能有助于解决此问题的内容添加到要点或访问 repo 中。
我感谢任何建议或指导。谢谢。