gpt4 book ai didi

ruby - 如何使用 DataMapper 聚合避免 N + 1

转载 作者:太空宇宙 更新时间:2023-11-03 16:37:53 25 4
gpt4 key购买 nike

如果我有一个 Foo 类型的模型,它有很多 Bar 类型的子记录,我希望能够显示 Foo 记录列表并显示子 Bar 记录的数量。所以我有类似...

@foos.each do |foo|
puts foo.name
puts foo.bars.count
end

我怎样才能避免 N+1 problem在我的聚合体上?换句话说,我不想对每一行进行新的 SELECT COUNT(*)... 查询。我可以简单地创建一个 SQL View 并将其映射到一个新模型,但是有更简单的方法吗?

最佳答案

DataMpper 对这些事情变化无常,所以我会给你几个选项来尝试,这些选项可能会起作用,具体取决于你的真实代码的样子。

  1. 只需将计数更改为大小,即放入 foo.bars.size。 DM 的战略性预加载有时可以使用这种方法。

  2. 在@foos.each 循环之前强制预加载,并将计数更改为大小,例如

    @foos = Foo.all(...)
    @foos.bars.to_a
    @foos.each do | foo |
    puts foo.name
    puts foo.bars.size
    end
  3. 在您的 @foos.each 循环之前发出一个原始 SQL 查询,该循环返回带有 foo id 和 bar 计数的结构,#map 将它们按食物 id 映射到哈希中,并将它们放入循环中。 (我只需要使用这种级别的废话一两次,我建议先摆弄一下 #1 和 2。)

关于ruby - 如何使用 DataMapper 聚合避免 N + 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4889479/

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