2016-08-26 22 views
0

我試圖通過續集寶石的eager方法渴望加載關係數據,同時使用with_sql來定義用於查詢的SQL(這是一個相當複雜的查詢)。急切的加載根本不起作用。相反,它爲每個返回的行生成每個關係的單個查詢,這正是我試圖避免的。下面是一些代碼:當使用with_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

你爲什麼使用'eager'寶石? SQL應該自己「急切加載」。你可以做的一件事是用一個簡單的查詢更新問題,也許只有一個連接。 –

回答

0

原來這不是with_sql的限制。問題在於有一個limit被添加到查詢下游,並強制加載被忽略。調用Foo.bar工作正常,但如果通過limit(<integer>)限制輸出,它必然會否定任何急切的加載,因爲sql查詢本身包含多個連接。我對Sequel文檔的理解表明,在這種情況下,急切的加載無法工作。如果情況並非如此,我很樂意聽到它。

+0

雖然有趣的是,Sequel的文檔特別聲明「Eager也適用於有限的數據集......」所以這個謎仍然存在。 – user2571294

+0

最後得到這個排序。您可以使用預先加載的限制,但調用順序似乎很重要。如果我這樣做:'with_sql(sql).limit(per_page).offset(per_page *(page - 1)).eager(:rel1,:rel2).all',它的工作原理。如果我在調用'eager'之後放置'limit'和'offset',它就不起作用。有趣。無論如何,只要超級開心就能最終實現這一目標。 – user2571294

0

請注意,Sequel中的eager使用每個關聯的查詢進行熱切加載。您可能想要使用eager_graph,它使用連接。您可以使用eager_graphwith_sql,但您可能還需要使用set_graph_aliases來告訴Sequel如何將每行分割爲單獨的對象。另外,請確保您在數據集上調用all以獲得結果,但如果不預先記錄所有記錄,則無法加載數據集。

在限制方面,只要您調用all就可以加載一個使用limit的數據集,但請注意,如果您急於加載* _many關聯,它通常不會執行您想要的操作。

相關問題