ruby-on-rails - 如何摆脱归因于 rails 关联的 n+1 查询?

标签 ruby-on-rails ruby activerecord associations eager-loading

我的代码中有一行如下所示...

injury.player_extract.player

我收到来自名为 bullet 的 gem 的通知,指出检测到 n+1 查询。现在有一个从受伤到球员提取的关联,然后是 player_extract 到球员——我将在下面概述。我已经尝试添加 -> { includes: player} 因为这是 bullet 推荐的,但我仍然收到错误。谁能解释为什么我仍然会收到它?

协会

injury.rb

belongs_to :player_extract, -> { includes :player },  class_name: 'PlayerExtract', foreign_key: 'Playerid', primary_key: 'Playerid'

player_extract.rb

belongs_to :player, foreign_key: 'Playerid', primary_key: 'leagueid'

player.rb

has_one :player_extract, class_name: 'PlayerExtract', foreign_key: 'Playerid', primary_key: 'leagueid'

最佳答案

您可能应该对所有数据使用预先加载来解决问题。

从简短的检查来看,您似乎在 injury.rb 上使用了 includes 指令,但在 player_extract.rb 上没有使用 - 所以每当使用 PlayerExtract 访问实际数据时,Player 就会延迟加载。

查看这些链接:

我可能会考虑将专用范围与 joins ( here ) 或 includes 指令一起使用...我不确定将指令放在关系中声明(has_one 等')是最好的方式。

关于ruby-on-rails - 如何摆脱归因于 rails 关联的 n+1 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776712/

相关文章:

mysql - 正在测试的 Rails : database configuration does not specify adapter production

ruby-on-rails - rails + CarrierWave : NoMethodError: undefined method `image_url' for nil:NilClass

ruby - Sinatra、Bundler 和 BUNDLE_PATH 混淆

ruby-on-rails - 如何从另一个模型预填充 ActiveAdmin 表单值?

ruby-on-rails - rails : uninitialized constant just happen on production server

ruby-on-rails - Benchmarking controller + view 一起,一口气多次

ruby - 如何在 ruby​​ 中解析符号

ruby-on-rails - attr_accessible(*attributes) 和 attr_protected(*attributes) 有什么区别?

sql - Rails4 : How to add Computed columns in Active record

ruby-on-rails - Rails where LIKE 和 array