天天看點

開發新手最容易犯的50個 Ruby on Rails 錯誤(1)

順帶說一句,你根本想不到,有多少人願意來參加并學習 rails 程式設計!

在分析了所有受訓者編寫的代碼之後,我們總結了50個最常見的錯誤!更糟糕的是,每個小組所犯的錯誤與前一組的錯誤幾乎一模一樣。

以下是 rails 新手常常忽略或做錯的地方。我們還包含了“對“,”錯”兩個版本的代碼樣本,使得教程更為清楚。

通常,rails 和許多 gems 會為它們使用的對象添加一些有用的幫助方法。例如,rails 會自動為布爾字段添加聲明。通常,這些方法的名字是以問号結尾的。請牢記這一點!

了解 orm 如何與資料庫互動是非常重要的。但是,新手往往沒有這種了解。是以,他們很少使用 “includes”、“preload” 與 “eager_load” 這類方法,并且對 “bullet” gem 一無所知。

在第一個例子中,n+1 查詢會傳遞至資料庫。”n” 是已經完成的家庭作業數量。查詢數量可能是10、20甚至100。而在第二個例子中,隻有2個查詢!

scopes 允許你隐藏資料庫的實作,并将代碼唯一化(uniqualize)。而且,代碼的可讀性也會大幅提升,因為他們透露了開發者的意圖,而非資料庫的結構。

模型的資料,包括其在 “after_create” 中的新 id,可以從内部,而非外部進行讀取,原因是交易尚未完成。

如果我在資料庫中建立了一條記錄,之後打算将其 id 放入 redis 或任意的存儲中,會得到以下結果:

如果 id 在交易完成之前使用,“after_create” 可能會導緻無效資料。

借助 “sidekiq” 或其他任意背景工作,我總是可以使用 “after_commit” 確定資料的完整性。

盡管使用對象無疑非常友善,但整個過程卻非常緩慢,而且需要很多記憶體。新手們可能并不了解代碼的工作原理,以及如何提高其效率。

在被移除之前,“dependent destroy” 會選擇所有受限記錄,建立其對象,并調用各自的毀滅方法。此方法允許你移除所有受限資料。但是,當涉及大量資料時,這種方法就不管用了。

至于 “dependent delete_all”,它會通過一條 sql 查詢移除自己。它效率很高,但是,在這種情況下,你得自己考慮資料庫的完整性。

根據協定,将 bang(!) 添加至方法名的情況有如下兩種:

如果某個方法修改了其通路的對象

如果某個方法在執行失敗後抛出了異常

新手們常常忽略第二種情況。如果代碼出了問題,你必須盡快找到問題根源。例如,如果完全不處理将記錄儲存至資料庫的結果,最好還是抛出異常以找到哪段代碼處理了無效資料。

在上例中,如果一個無效的物品傳給輸入,就會被忽視。

如果字段中的某個模型必須要有一個預設值,應該通過資料庫進行安裝。

對于基礎架構的限制條件越多,我們的應用就會越可靠。此外,别忘記 “null:false”,使用者不可以沒有簡介。

如果不能復原,遷移的意義在哪兒?

以上是新手們最常犯的 ruby on rails 錯誤的第一部分,如果喜歡本文,請記得分享哦。

未完待續……