2017-07-18 107 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 
相关问题