2012-08-03 42 views
0

我不喜歡在空分貝自動驗證存在SQL哪裏約束不允許爲空

我看到了太多的錯誤出現在從空的,有時令人驚訝的性質多年。特別是對於我們不期望包含空值的列,我們很容易無法考慮其含義並得到不好的結果。我堅信空字符串字段(如果允許)通常應該在數據庫中表示爲空字符串vs null。 (儘管最糟糕的是允許兩者混合使用,但它們兩者意味着相同的東西)

因此,由於我對過去問題的經驗,我已經有條不紊地考慮每個字段並將約束條件添加到:null => false在數據庫領域,我沒有一個很好的理由,允許空值。對於我想允許空字符串的情況,我將其設置爲默認值。

到目前爲止這麼好。

我喜歡對待默認如何紅寶石值

正如我已經做到了這一點我已經注意到,ActiveRecord的需要在數據庫中定義我的默認,並用該值對象的初始化屬性。我喜歡那個!

但是這讓我想要更多。因爲現在我發現我加入如下代碼

validates :name, :presence => true 

在那裏我已經在除非我選擇提供一個默認的空字符串的情況下該數據庫定義的非空約束每一個案件。但是,我爲什麼重複自己?所以我在想 - 如果ActiveRecord爲我做了這件事,會不會很好?

如何添加驗證從數據庫性能

存在是有辦法,我可以自動創建這些驗證了那裏是一個數據庫中的NOT NULL約束每一個案件 - 除了在特殊情況下我允許空字符串並通過將其設置爲默認值來表示該信號?

Bonus:如果有一種方法可以讓rails爲db列添加一個不同於空字符串的檢查,並且只有在它們同時具有非空約束和非空約束時才自動爲字符串字段添加存在驗證空字符串檢查,這將是非常好的。只是不知道這是否可能。

+2

一旦你理解了NULL的處理,它的性質將會變得令人驚訝的不那麼令人驚訝。 – 2012-08-03 18:58:10

+0

是的,但預防也很好。特別是當你在談論如何管理一支有營業額的團隊時。 – snowguy 2012-08-03 20:03:18

回答

1

我想你可以通過添加一個observer來實現類似的功能,默認情況下會進行驗證。但是,我不確定是否有方法從觀察者方法中取消操作,就像使用回調函數一樣。