ruby on rails爬坑(二):Active Record數據庫查詢

一,相關資料

不多說,精髓都在文檔裏。文檔如下:

- rails官方:Active Record 查詢

二,遇到的問題

先說問題:

#下面兩條語句完成了相同的功能,可是性能有所差別
Mission.where(" title = 'test' ")[0]
Mission.where(" title = 'test' ").first #better

我們用rails來打造一個內部運營使用的CMS(content management system),既然是內容運營,那肯定少不了和數據庫打交道。之前有位同事和我說了一句很有道理的話,在這裏分享一下:

CMS可以看作數據庫的一個映射,通過在CMS上的操作來操縱數據庫裏的數據。

對Active Record感興趣的朋友可以直接看上面的文檔,或者找一下英文的官方文檔(不知道英文的會不會更新快點,交替着看吧,畢竟自己以後也是要寫文檔的)。請注意:

這篇博客不會介紹Active Record的每一個方法,官方文檔有,不缺我這個搬運工,我只聊聊我遇到的問題及一些想法。

最近寫了一些rails數據庫查詢的代碼,說實話rails在數據庫增刪改查方面怎麼太好使了,將Mysql的方法封裝得很完整,也考慮到很多性能相關的問題,比我之前接觸過的nodeJS要簡單一些(當然,接觸不多,只是第一印象,不是定論)。但也正是rails在這方面的便捷以及ruby自由的語法給我帶來了一些問題,作爲初學者,我第一時間考慮的是某個功能怎麼實現。隨着寫的代碼多了,也開始思考爲什麼是這樣,換種做法有怎樣?這些問題。

三,解決方法及思考

Mission.where(" title = 'test' ")[0]
Mission.where(" title = 'test' ").first #better

以前我都習慣用第一種,正常運行,沒想太多。後來也陸續看了一些別人的代碼,發現別人都用第二種,於是我好奇兩者的差別在哪,做了個小測試,分別運行這兩條語句,看看控制檯輸出相應的SQL語句是什麼。結果如下:

Mission.where(" title = 'test' ")[0]
# SELECT "missions".* FROM "missions" WHERE (title = "test")

Mission.where(" title = 'test' ").first #better
# SELECT  "missions".* FROM "missions" WHERE (title = "test") LIMIT 1

顯然,第二種方法性能要好一些,由對應的SQL語句可以看出,第一種方法是獲取了所有滿足條件的數據,再取出第一條;第二種方法是獲取滿足條件的第一條數據,只返回這一條。至於爲什麼是這樣的,看文檔:

Model.find(options) 方法執行的主要操作概括如下:
1,把指定的選項轉換成等價的 SQL 查詢語句;
2,執行 SQL 查詢,從數據庫中獲取結果;
3,爲每個查詢結果實例化一個對應的模型對象;
4,如果有 after_find 回調,再執行 after_find 回調;

文檔中以find爲例子講解了數據庫查詢過程,其餘的也類型,重點是:“把指定的選項轉換成等價的 SQL 查詢語句”,而上面的 .first 正是查詢的一種選項,而 [0] 不是,所以對應生成的SQL語句不同,性能也不同,第二種方法只返回了一條數據,性能自然要好一些,只是數據量較少的時候不明顯。

其實解決問題的首要做法是:

認真看文檔。

而遇見問題的最好做法是:

多寫代碼。

那解決問題的終極要義是什麼?

我的理解是,看問題背後的本質是什麼,程序是怎麼運行的。

上面都是一些比較空的話,但也是感悟,說些實在的。

rails運行時多看控制檯的輸出,既然是輸出,輸出也是一種有用的信息,能幫助我們更好地理解rails,當然,看源碼估計是以後少不了的。

注意:rails在development模式下(用rails s或rails s -e development)纔會將信息輸出到控制檯,至於怎麼配置,我試着改了一下config相關的文件,在test模式下沒生效,會再研究一下。

四,題外

這只是個小問題,也許不值得寫篇博客,但希望記錄問題的解決思路。關於查詢還有個問題在研究中,後面會更新這篇博客。

寒假正式開始,也快要過年了,新年快樂,加油。

發佈了32 篇原創文章 · 獲贊 87 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章