今天就遇到一個問題,用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