簡體   English   中英

如何禁用活動記錄查詢的延遲加載?

[英]How can I disable lazy loading of active record queries?

我想使用類似於以下內容的WHERE子句從數據庫查詢一些對象:

@monuments =  Monument.where("... lots of SQL ...").limit(6)

后來,在我看來,我使用@monuments.first類的方法,然后遍歷@monuments ,然后顯示@monuments.count

當我查看Rails控制台時,我看到Rails多次查詢數據庫,首先限制為1(對於@monuments.first ),然后限制為6(用於循環遍歷所有數據庫),最后是發出count()查詢。

如何告訴ActiveRecord僅執行一次查詢? 只執行一次查詢(限制為6個)就足以獲取我需要的所有數據。 由於查詢速度很慢(80毫秒),因此重復查詢會花費大量時間。

在您遇到的情況下,您將需要在調用first之前觸發查詢,因為雖然firstArray上的方法,但它也是ActiveRecord對象上的“ finder方法”,它將獲取第一條記錄。

您可以使用任何需要數據處理的方法來提示。 我更喜歡使用to_a因為很明顯,我們將在處理數組之后:

@moments = Moment.where(foo: true).to_a
# SQL Query Executed
@moments.first #=> (Array#first) <Moment @foo=true>
@moments.count #=> (Array#count) 42

在這種情況下,您也可以使用first(6)代替limit(6) ,這也會觸發查詢。 但是,這對於您團隊中的另一位開發人員而言可能不是很明顯。

AFAIK, @monuments.first不應訪問數據庫,我在控制台上確認了它,也許您有多個具有相同變量的實例,或者您正在做其他事情(您在此處未共享),共享確切的代碼並進行查詢,我們可能會調試。

由於ActiveRecord Collections充當數組,因此可以使用數組類比來避免查詢數據庫。

first您可以

@monuments[0]

關於count ,是的,這是命中數據庫的另一個查詢,為避免它,您可以使用length作為..

@monuments.length

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM