簡體   English   中英

驗證由另一個屬性存在范圍內的屬性的唯一性

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

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