0

我试图通过 Sequel gem 的eager方法急切加载关系数据,同时使用with_sql定义用于查询的 sql(这是一个相当复杂的查询)。急切的加载根本不起作用。相反,它为返回的每一行的每个关系生成一个查询,这是我试图避免的。这是一些代码:

class Foo
  many_to_one :rel1
  one_to_many :rel2
  def self.bar
    sql = 'some complex sql'
    Foo.with_sql(sql).eager(:rel1, :rel2)
  end
end

问题是当我调用 Foo.bar 时,rel1 和 rel2 的急切加载似乎被忽略了。我通过查看日志验证了这一点——对于with_sql调用返回的每一行,它会生成另外 2 个查询——一个用于 rel1,一个用于 rel2。

可能值得注意的是它sql包含 3 个连接。

这是使用with_sql. 有没有办法绕过这个限制?

4

2 回答 2

0

事实证明,这不是with_sql. 问题是limit下游的查询中添加了一个,这迫使急切的加载被忽略。调用Foo.bar工作正常,但如果你通过 限制输出limit(<integer>),它必然会否定任何急切加载,因为 sql 查询本身包含多个连接。我对 Sequel 文档的理解表明急切加载在这种情况下无法工作。如果不是这样,我很想听听。

于 2016-08-26T19:11:37.787 回答
0

请注意,eager在 Sequel 中,使用每个关联的查询进行预加载。您可能想要使用eager_graph,它使用连接。您可以使用eager_graphwith with_sql,但您可能还需要使用set_graph_aliases来告诉 Sequel 如何将每一行拆分为单独的对象。此外,请确保您调用all数据集以获取结果,如果没有预先准备好所有记录,您不能急切地加载数据集。

在限制方面,您可以预先加载使用 的数据集,limit只要您调用all它,但请注意,如果您急切加载 *_many 关联,它通常不会执行您想要的操作。

于 2016-08-26T22:02:29.390 回答