2017-07-18 108 views
0

我細讀Ruby on Rails Guides article on ActiveRecord validations,我碰到這個整潔的摘錄出來有關uniqueness驗證:如何在Rails中爲ActiveRecord模型添加自定義唯一性驗證?

還有一個:你可以用它來定義唯一性約束是否區分大小寫或不CASE_SENSITIVE選項。該選項默認爲true。

這是一個非常有用的功能,可以確保兩個用戶無法使用相同的用戶名或電子郵件進行註冊,例如。但是,我想使用類似的驗證,但使用不同的方法來確定字符串的平等。我想確保我的所有條目在squeeze下都是唯一的。

作爲一個例子,說我的Post模型有一個文本屬性content。我想確保如果foo bar已經在數據庫中,它將不會接受foo barfoo bar。有沒有更好的方法來做這件事,而不僅僅是添加一個自定義驗證來遍歷每個條目的Post.all,squeeze,並將其與squeezed content進行比較?我無法想象這個比例很好。

回答

2

雖然您可能會嘗試以「Rails」方式完成所有操作,但在這種情況下,我會走另一條路徑。如果由於某種原因想要在數據庫中保留「foo        bar」內容,只需引入一個新字段squeezed_content,實施post_commit掛鉤以更新此字段,並將扣分值設爲content,並暗示對該新引入的squeezed_content字段進行驗證,以強制其實施爲唯一。

此外,您可能只是存儲已擠壓值。

1

您可以添加另一列到你的posts表稱爲squeezed_content或類似的東西,然後做這樣的事情可以使用內置的獨特性驗證:

class Post < ActiveRecord::Base 
    before_save :set_squeezed_content 
    validates :squeezed_content, uniqueness: true 

    def set_squeezed_content 
    self.squeezed_content = content.squeeze 
    end 
end 
相關問題