[Rails tips] validates uniqueness scope 的應用

在一些情況下我們可能會需要驗證某個資料是只能出現一次的,在 MySQL 有一種 index 叫做 unique (唯一鍵)的索引可以處理這種驗證,在 Rails 中可以用 add_index :xxx, :ooo, :unique => true 的方式替它打上唯一鍵。

但是如果不想用索引來驗證,想要透過 Rails 端來處理這件事的話,則可以用 validates :xxx, :uniqueness => true 來處理,一樣可以處理唯一資料,只是這種驗證方式略顯單調,因為它預設的情境是:整張資料表只能有這種資料一次。這樣有時候會不能符合我們所需要的情境,譬如說:

某個 user 只能夠各建立一個 service_typesay_hellosay_hi 的資料時,我們如果用: validates :service_type, :uniqueness => true 來處理就會炸掉,這時候我們就可以手動加上 :scope 來綁定驗證條件:

validates :service_type, :uniqueness => { :scope => :user_id }

這樣一來,就能夠確保每個 user 都可以各建立一次 service_typesay_hello 以及 say_hi 的資料了。

Comments

comments powered by Disqus