天天看點

ActiveRecord中Find與Where差別

今天就遇到一個問題,用Find可以,但用Where會報錯,情形是這樣的:

如果調用代碼是這樣的

執行不會報錯。

如果是上面的,執行會報錯:

找不到level方法,但用find查找時卻沒有問題,這才意識到find與where查找是有差別的。

後來去<a href="http://guides.rubyonrails.org/active_record_querying.html" target="_blank" rel="external nofollow" target="_blank">rails guide</a>找了些資料,總結如下:

從資料庫中查找對象有以下方法。

[list]

where

select

group

order

limit

offset

joins

includes

lock

readonly

from

having

[/list]

上面這些方法和SQL中關鍵字都有對應,隻是為了代替原生的SQL語句,完成後傳回一個ActiveRecord::Relation執行個體。

但Rails自創了Model.find(options)方法。

[list]

轉換options到相應的sql語句

執行sql查詢并擷取資料庫查詢結果

把每條記錄根據model執行個體化成對應的Ruby對象

如果有的話,執行after_find 回調方法

[/list]

看後恍然大悟,Find比其它查詢會多出3和4兩步操作,這就是問題所在。

以後要盡量少用where等與原生SQL緊密的查詢,多用Find。

歡迎通路個人小博:

http://rubyer.me/blog/470

繼續閱讀