【问题标题】:Rails ActiveRecord where condition eager loadRails ActiveRecord 条件急切加载
【发布时间】:2015-03-16 03:24:39
【问题描述】:

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

从第一个分贝

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'

【问题讨论】:

  • 你是否在你的代码中加入了这些?您显示的代码很少,因此很难判断是否发生了其他事情。这是你所有的代码吗?如果您只执行脚本的 txn = db2.table_db2.all 部分而不执行其他操作,是否会引发错误?
  • 问题可能出在.each 本身,但如果不向我们展示.each 块中发生了什么,我们将永远无法猜测。如果您只是将每个块的内部留空而实际上并没有在其中做任何事情怎么办?还是报错吗?

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


【解决方案1】:

没有太多的信息可以继续,但如果它似乎是一个负载问题,然后加载两个表:

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

【讨论】:

  • 可能是因为它是一个使用 ActiveRecord 而不是标准 Rails 应用程序的脚本。也许是因为多个手柄。很高兴知道它有效。您能否“接受”答案,使其显示为已回答?
  • 我确实接受了答案。 “可能是因为多个手柄”是让我感到不安的部分。可能其他人可以对此有所了解。感谢您的帮助。
  • 看起来好像您单击了“Upvote”按钮,因为它有一个“1”表示赞成票,当您单击“accept answer”时,它会显示一个绿色复选标记。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多