Rails ActiveRecord条件急切加载

时间:2015-03-16 03:24:39

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord eager-loading

我有一种情况,我需要访问2个数据库来构建某个数据集。这是使用ActiveRecord gem的ruby代码。不是RAILS。我正在处理遗留数据库并使用Ruby开发提取脚本。

从第一个db

开始
users = db1.table_db1.where("user_id in (?)", user_ids)
txn = db2.table_db2.all

在此之后我引用用户

users.each do |user|
   # do something
end

尝试执行users.each时,我得到如下例外。

如果我在访问db2之前访问users变量,则此问题不再存在。看起来这与急切负载有关吗?

Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `query'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `block in execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_adapter.rb:373:in `block in log'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activesupport-4.1.7/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_adapter.rb:367:in `log'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:303:in `execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:228:in `execute'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:232:in `exec_query'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/mysql2_adapter.rb:240:in `select'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract/database_statements.rb:24:in `select_all'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/connection_adapters/abstract/query_cache.rb:70:in `select_all'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/querying.rb:39:in `find_by_sql'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:611:in `exec_queries'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:493:in `load'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation.rb:238:in `to_a'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'
file-exporter.rb:179:in `block (2 levels) in <main>'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'
/Users/devuser/.rvm/gems/ruby-2.1.2@global/gems/activerecord-4.1.7/lib/active_record/relation/delegation.rb:46:in `each'

1 个答案:

答案 0 :(得分:1)

没有大量的信息可以继续,但如果它似乎是一个负载问题,那么加载两个表:

users = db1.table_db1.where("user_id in (?)", user_ids).load
txn = db2.table_db2.all.load