[英]Ruby on Rails: Is it better to validate in the model or the database?
通常更好的做法(以及為什么)驗證模型或數據庫定義中的屬性?
對於(一個微不足道的)例子:
在用戶模型中:
validates_presence_of :name
與遷移相比:
t.string :name, :null => false
一方面,將其包含在數據庫中似乎更能保證不會出現任何類型的壞數據。另一方面,將其包含在模型中會使事情更加透明,更容易理解,方法是將其分組到代碼中。其余的驗證。 我也考慮過兩者兼顧,但這似乎既不干,也不易維護。
我強烈建議在兩個地方都這樣做。 在模型中執行此操作可以為您節省數據庫查詢(可能在整個網絡中),這些查詢本質上會出錯,並且在數據庫中執行此操作可確保數據一致性。
並且
validates_presence_of :name
不一樣的
t.string :name, :null => false
如果只在數據庫中設置NOT NULL列,則仍可以插入空值(“”)。 如果您使用的是模型validates_presence_of - 則不能。
兩者都是好的做法。 模型驗證是用戶友好的,而數據庫驗證添加了最后的組件,可以加強代碼並顯示應用程序邏輯中缺少的驗證。
它有所不同。 我認為應該在數據庫中完成簡單的,與數據相關的驗證(例如字符串長度,字段約束等)。 遵循某些業務規則的任何驗證都應在模型中完成。
我建議使用Migration Validators項目( https://rubygems.org/gems/mv-core )來定義db級別的驗證,然后將其透明地提升為ActiveRecord模型。
例:
在遷移中:
def change
create_table :posts do |t|
t.string :title, length: 1..30
end
end
在你的模型中:
class Post < ActiveRecord::Base
enforce_migration_validations
end
因此,您將獲得兩級數據驗證。 第一個將在db中實現(作為檢查約束的觸發條件),第二個將在模型中作為ActiveModel驗證。
取決於您的應用程序設計,如果您有一個中小型應用程序,您可以在兩者中或僅在模型中執行它,但如果您有一個大型應用程序可能是面向服務或層次,那么具有基本驗證,即強制/可空,數據庫中的最小/最大長度等,更嚴格,即模型中的模式或業務規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.