我尝试通过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
的限制吗?有没有解决这个限制的方法?
答案 0 :(得分:0)
原来这不是with_sql
的限制。问题是在下游查询中添加了limit
,这会强制忽略急切加载。调用Foo.bar
工作正常,但如果通过limit(<integer>)
限制输出,则必然会否定任何急切加载,因为sql查询本身包含多个连接。我对续集文档的理解表明,急切的加载在这种情况下无法正常工作。如果情况并非如此,我很乐意听到它。
答案 1 :(得分:0)
请注意,Sequel中的eager_graph
使用每个关联的查询进行急切加载。您可能希望使用eager_graph
,它使用连接。您可以将with_sql
与set_graph_aliases
一起使用,但您可能还需要使用all
告诉Sequel如何将每一行拆分为单独的对象。另外,请确保在数据集上调用limit
来获取结果,如果没有事先记录所有记录,就无法加载数据集。
就限制而言,您可以急切地加载使用all
的数据集,只要您在其上调用{{1}},但请注意,如果您热切期望它通常无法执行您想要的操作加载* _many协会。