簡體   English   中英

Ruby on Rails:在模型或數據庫中驗證是否更好?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM