2011-10-15 25 views
4

我來自數據庫模式儘可能完全定義的背景,例如字段長度,非null,默認值,複雜的參照完整性等。對於Rails,我必須在模型中完成所有這些操作才能獲得智能驗證。那麼我是否也複製了數據庫定義中的所有內容?對於Rails應用程序,我應該在數據庫以及模型中進行驗證嗎?

例如,如果電子郵件是必填字段,請將validates :email, :presence => true添加到模型AND :null => false以進行遷移嗎?

字符串呢?如果我在模型中有:length => { :maximum => 50 },我是否也希望:limit => 50在遷移中?

難道我的外鍵添加到數據庫實施參照完整性?

或者是「Rails的方式」做盡可能多的模型和數據庫保持爲「啞巴」持久性引擎?

回答

2

確定添加:null => false。否則你的DBA可能會傷害你。您的Rails應用程序不是唯一觸及數據庫的應用程序。

最大長度爲您提供了一個增益DB內存。絕對設置最大長度,但一定要添加導軌驗證。如果沒有,您可能會遇到更加奇怪的應用程序錯誤

外鍵是好的,但在Rails應用較少使用

+0

Re。最大長度,我假設由Rails創建的默認「vary(255)」使用與「vary(50)」相同的空間,只要存儲了50個字符即可。風險(至少在我的MS SQL 2000天)是,如果某人以某種方式添加更長的數據,字段長度的總和可能會超過最大行長度。 –

+0

所有這三個答案都很有幫助。由於user458221首先回答並解決了所有問題,我會將其作爲答案進行檢查。聽起來就像在一個完美的Rails世界中,DB驗證不是必需的,但在現實世界中,額外的安全網是一個好主意。作爲個人喜好,我喜歡能夠查看架構以瞭解應用程序的基本業務規則。 –

0

通常情況下,最好的做法是保留儘量多的邏輯出了DB儘可能的。將可空驗證添加到您的遷移並不會真正傷害或幫助保持邏輯。如果你正在使用模型驗證,那麼你的大部分應用程序都應該穿過那個。這是在我心中的洗滌。

在這裏你可以走極端是其他類型的約束。有些數據庫支持各種瘋狂的約束條件,這些約束條件與驗證器一樣更好 - 驗證器更容易以自動方式測試和運行這些測試。

如果你有若干塊觸摸DB的,他們是不是所有的紅寶石,然後寫一個SOA層來完成所有的驗證和這樣的代碼往往是有用的。再次,測試代碼比DB中的邏輯更容易。

1

標準的「Rails的路」,是保持約束的Ruby代碼。

我很少擁有隻有Rails(甚至只是Ruby)觸摸數據庫的奢侈品......而且說實話,即使只是人們直接在數據庫上進行操作也會導致問題......所以我傾向於使用數據庫的限制也是如此,因爲我不確定數據是否會過於修飾。

相關問題