使用with_sql时,Sequel是否可以加载关系?

时间:2016-08-26 15:36:03

标签: ruby sequel eager

我尝试通过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的限制吗?有没有解决这个限制的方法?

2 个答案:

答案 0 :(得分:0)

原来这不是with_sql的限制。问题是在下游查询中添加了limit,这会强制忽略急切加载。调用Foo.bar工作正常,但如果通过limit(<integer>)限制输出,则必然会否定任何急切加载,因为sql查询本身包含多个连接。我对续集文档的理解表明,急切的加载在这种情况下无法正常工作。如果情况并非如此,我很乐意听到它。

答案 1 :(得分:0)

请注意,Sequel中的eager_graph使用每个关联的查询进行急切加载。您可能希望使用eager_graph,它使用连接。您可以将with_sqlset_graph_aliases一起使用,但您可能还需要使用all告诉Sequel如何将每一行拆分为单独的对象。另外,请确保在数据集上调用limit来获取结果,如果没有事先记录所有记录,就无法加载数据集。

就限制而言,您可以急切地加载使用all的数据集,只要您在其上调用{{1}},但请注意,如果您热切期望它通常无法执行您想要的操作加载* _many协会。