我想用類似如下的WHERE子句來查詢從數據庫中的一些對象:如何禁用活動記錄查詢的延遲加載?
@monuments = Monument.where("... lots of SQL ...").limit(6)
後來,在我看來,我用像@monuments.first
方法,然後我遍歷@monuments
,然後我展示@monuments.count
。
當我查看Rails控制檯時,發現Rails多次查詢數據庫,首先限制爲1(對於@monuments.first
),然後限制爲6(對所有數據進行循環),最後它發出一個count()查詢。
我該如何告訴ActiveRecord只執行一次查詢?只需執行一次限制爲6的查詢就足以獲得我需要的所有數據。由於查詢速度很慢(80ms),因此重複它會花費很多時間。
這裏有很多猜想,不持有水。您可能想查看優秀的[Rails ActiveRecord查詢指南](http://guides.rubyonrails.org/active_record_querying.html)。 – coreyward
我可能沒有能夠更好地解釋,但我非常確定,即使沒有'.to_a'和'.first'沒有命中db,OP詢問的類型的where查詢也會被執行。事實上,使用'.to_a'首先有很多缺點,當你轉換爲array時,你不能執行作用域查詢或任何其他與AR有關的方法。其次,正如你所提到的那樣,它會在以後讓開發者感到困惑。第三,'.count'命中db不是因爲它並沒有被第一個執行,而是一個作用域查詢並且改變了實際查詢的定義,即'@ monuments' .. –
如果你能想出一個例如,一個查詢不是先執行,而是在'to_a'之後執行,並且當'.first'被追加時,它會再次執行db .. –