[英]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
之前觸發查詢,因為雖然first
是Array
上的方法,但它也是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.