繁体   English   中英

在Rails中修复需要计数器的N + 1查询

[英]Fixing N+1 queries in Rails that need a counter

我对优化查询还很陌生,我有一个N + 1查询,而且似乎需要一个计数器,但是我不确定如何继续:

...
SQL (0.5ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `photos` WHERE (`photos`.attachable_id = 4864 AND `photos`.attachable_type = 'Recipe')) AS subquery
SQL (2.1ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `votes` WHERE (`votes`.voteable_id = 4864 AND `votes`.voteable_type = 'Recipe') AND (`votes`.`vote` = 1)) AS subquery
SQL (2.0ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `votes` WHERE (`votes`.voteable_id = 4864 AND `votes`.voteable_type = 'Recipe') AND (`votes`.`vote` = 0)) AS subquery
SQL (0.3ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `photos` WHERE (`photos`.attachable_id = 4865 AND `photos`.attachable_type = 'Recipe')) AS subquery
SQL (2.6ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `votes` WHERE (`votes`.voteable_id = 4865 AND `votes`.voteable_type = 'Recipe') AND (`votes`.`vote` = 1)) AS subquery
SQL (2.4ms)  SELECT COUNT(*) AS count_id FROM (SELECT 1 FROM `votes` WHERE (`votes`.voteable_id = 4865 AND `votes`.voteable_type = 'Recipe') AND (`votes`.`vote` = 0)) AS subquery
...

因此,我有两件奇怪的事情在这里带来了问题。 我有这个多态vote模型,我需要总结所有这些模型,基本上,如果有人投了反对票,那么它在vote栏中的值为0 ,如果用户投了反对票,则值为1 但是看起来它创建了这个疯狂的查询。

我该如何补救?


我认为,导致这种情况的原因始于我认为这种方法:

<%= recipe.votes.tally %>

这就是我计算选票的方式:

class Vote < ActiveRecord::Base

  scope :up, where(:vote => true)
  scope :down, where(:vote => false)

  def self.tally
    self.up.count - self.down.count
  end

end

但是由于我要为每个对象执行此操作,因此它必须多次执行此逻辑,所以最终我们会得到疯狂的N + 1。

当你写的时候

我认为,导致这种情况的原因始于我认为这种方法:

<%= recipe.votes.tally%>

您可以通过在脚本/控制台中获取配方实例并在其中执行配方.votes.tally来获得更多确定性

不太确定,这有点含糊,但是您是否可以考虑将计数方法放在配方模型中? -斯蒂芬

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM