2012-07-28 103 views
16

我已經在一些資源在網上找到喜歡做的東西,當比:延遲加載3.2.6

cars = Car.where(:colour => 'black') 

不執行查詢,直到你做這樣的事情:

cars.each {|c| puts c.name } 

然而在我的Rails 3.2.6項目,當我做在控制檯以下:

User.where(:first_name => "John") 

我得到如下:

User Load (1.2ms) SELECT `users`.* FROM `users` WHERE `users`.`first_name` = 'John' 

因此,查詢正在執行的權利?

延遲加載去哪兒了?或者我在這裏錯過了什麼?

回答

34

控制檯調用inspect對任何您輸入的表達式的結果,以便它可以顯示給你。 inspect是會觸發查詢負載的事情之一。如果你不是做

x = User.where(:first_name => 'John'); false 

,那麼你應該看不到任何查詢,因爲這時候的控制檯呼籲false而不是Active Record的關係對象的檢查。

+0

這是在控制檯的動態環境中探索(通常是富有成效的努力)實際上會導致ActiveRecord工作方式混亂的情況之一。我已經知道這種懶惰加載行爲,但我偶爾也會被這個絆住。我真的很喜歡你的「假」主意。當在控制檯中工作時,會盡量使我肌肉記憶的一部分。 – 2013-12-06 16:26:12

+0

感謝您的好評!究竟哪些事情會觸發查詢加載ActiveRecord :: Relation對象? '拔',說? – 2015-01-09 16:40:31

+1

@kitkat pluck運行一個只返回列值而不是AR對象的查詢。像每一個,地圖,拒絕,to_a等都會導致關係被加載。基本上在關係上缺少一個方法來加載目標並將方法調用轉發給它。 – 2015-01-09 22:26:41

3

這是一個有趣的問題....答案是,當在IRB /控制檯中執行某些內容時,它會調用對結果對象的檢查,然後將其打印出來。如果你做了這樣的事情:

User.where(:first_name => "John").class 

你應該得到一個ActiveRecord :: Relation對象。

因此,Rails的延遲加載仍然存在,這只是控制檯工作的方式。

希望這會有所幫助。

來源(S): 1)https://rails.lighthouseapp.com/projects/8994/tickets/4951-rails-console-executes-where-queries-without-lazy-loading 2)Why Active Record relation is not returned in console?

0

我跑使用sqllite3試圖找出是否AR基地發現居然立刻做了一個查詢測試。下面是我做的:

rows=Customer.orders.find(1,2) 

然後我做:

ActiveRecord::Base.remove_connection; 
p rows 

我沒有建立錯誤的連接。

我也試過「P行」後立即查詢W/O刪除連接,並得到了我預期的2行。

這是通過activerecord-3.1.3完成的。我的結論是,在3.1.3 base中查找等待直到訪問數組(Relation?)時才執行查詢。

我是Ruby新手,所以我的測試可能設計不正確。

+0

可能希望將結論移到頂端,以免人們誤認爲「我也有這個問題」。 – 2015-03-19 01:02:42