2

我工作的一個回報率的項目,我想有唯一性驗證我的車型之一,對自定義的範圍檢查:只有validate_uniqueness_of可以使用自定義作用域嗎?

class Keyword < ActiveRecord::Base 
    belongs_to :keyword_list 

    scope :active, -> { where("expiration > ?", DateTime.now) } 

    validates :name, uniqueness: { scope: [:active, :keyword_list_id] } 
end 

,這是行不通的。它檢查數據庫活躍列,它不存在,並拋出這個錯誤:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column keywords.active does not exist 

所以,我的問題是,有沒有什麼辦法,使這項工作,或者我必須寫一個自定義的驗證?如果是這樣,是否有關於它應該看起來如何擊中數據庫太多的提示?

回答

2

不,您將不得不編寫自定義驗證。

試試這個。

# In app/models/keyword.rb 

validate :freshness 

private 

def freshness 
    if Keyword.active.find_by(name: self.name, keyword_list_id: self.keyword_list_id) 
    errors.add(:base, "Name is not fresh enough.") # Fails the validation with error message 
    end 
end 

這是另一個有趣的一點,你不能依靠validates_uniqueness_of,或在軌道任何其他獨特的驗證,因爲驗證不原子運行,這意味着,如果兩個相同的記錄被插入在同一時間,有是否SQL約束驗證唯一性,ruby驗證將通過並插入兩條記錄。

我在這裏想說的是,如果您的驗證是關鍵任務,請使用SQL約束。

相關問題