[英]Validate uniqueness of attribute scoped by another attribute presence
如果我需要驗證所有者范圍內的貓名的唯一性,以便沒有所有者可以擁有許多同名的貓,我可以使用它:
validates_uniqueness_of:name, scope: :owner_id
但是我如何驗證貓是否擁有所有者的唯一性呢?
所以所有有主人的貓都有唯一的名字。
所有沒有主人的貓都有唯一的名字。
所以它類似於scope: self.owner.present?
.
我可以在不使用自定義驗證方法的情況下使用驗證助手嗎?
您可以將conditions
子句分配給您的唯一性驗證。 請參閱文檔,其中給出了以下示例:
class Article < ActiveRecord::Base
validates_uniqueness_of :title, conditions: -> { where.not(status: 'archived') }
end
所以如果你想確保所有沒有主人的貓的唯一性,你會寫
validates_uniqueness_of :name, conditions: -> { where(owner_id: nil) }
或者,如果您想確保所有擁有主人的貓的名字都是唯一的,無論它們的主人是誰:
validates_uniqueness_of :name, conditions: -> { where.not(owner_id: nil) }
如果你只想做一個或另一個,那就行了。 然而,如果你想同時做這兩個,你會發現這兩個條件都被檢查了——而且實際上,你返回的是一個唯一性約束,它檢查整個表,但是在兩個查詢中而不是一個。
所以,如果我們確實想要兩個檢查,我們需要確保只檢查其中一個,我們可以使用if
/ unless
修飾符來做到這一點:
validates_uniqueness_of :name, conditions: -> { where(owner_id: nil) },
if: -> { owner_id.nil? }
validates_uniqueness_of :name, conditions: -> { where.not(owner_id: nil) },
unless: -> { owner_id.nil? }
因此,現在,如果您的貓有一個所有者 ID,則將運行檢查 scope 中具有所有者 ID 的所有記錄的唯一性的驗證。 但如果它沒有所有者 ID,則將啟動其他驗證。
這意味着要跳過更多的箍,但應該可以滿足您的需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.