gpt4 book ai didi

ruby-on-rails - rails : Optimize query N+1 with same table one_to_many and scope conditions

转载 作者:数据小太阳 更新时间:2023-10-29 08:57:39 26 4
gpt4 key购买 nike

这是我面临的一个挑战,使用 Rails 5(我使用 Skylight 报告 N+1 查询的服务,他们推荐的解决方案是 here ,但对我来说这还不够)。

我有一个表 nodes 和一个 Node 可以有几个与之相关的 nodes (有一个名为 parent_node_id) 使我能够将一对多联系起来。

class Node < ApplicationRecord
...
belongs_to :parent_node, foreign_key: :parent_node_id, class_name: 'Node', optional: true, inverse_of: :nodes
has_many :nodes, foreign_key: :parent_node_id, class_name: 'Node'
...
end

重要层次结构的级别最大为 1。这意味着 node.nodes.first.node 不会发生。具有 parent_nodenode 没有更多的 nodes

问题是我遇到了 N+1 的性能问题,因为在原始查询中包含 nodes 是不够的,因为在循环中我用不同的范围查询每条记录。这是暴露问题的示例代码:

# In a controller, including nodes so it does not query inside
nds = Node.some_scope.include(:nodes)
nds.each do |nd|
...
# In a model
# If I loop inside, there's no extra SQL queries, all good
nd.nodes.each do |nd2|
...
end
...
# In a model
# Here's the N+1 issue
nd.nodes.another_scope.each do |nd3|
...
end
# Returns a value to the controller
...
end

这无论如何都会触发每个 nd3 变量的 SQL 查询,因为有 another_scope 修改了原始 nds 值,我不能包括nds 值中的条件,因为 nd2 需要不满足 another_scope 条件的 nodes .

有没有办法优化这个?

最佳答案

another_scope 替换为 select { |n| n.satisfies_another_scope_criteria? }

由于您已经获取了所有子项,因此无需在数据库中再次过滤它们,除非 another_scope 中有 limit 子句

关于ruby-on-rails - rails : Optimize query N+1 with same table one_to_many and scope conditions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com