我正在仔细阅读Ruby on Rails Guides 关于 ActiveRecord 验证的文章,我看到了关于uniqueness
验证的简洁摘录:
还有一个 :case_sensitive 选项可用于定义唯一性约束是否区分大小写。此选项默认为 true。
例如,这是一个非常有用的功能,可以确保两个用户不能使用相同的用户名或电子邮件进行注册。但是,我想使用类似的验证,但使用不同的方法来确定字符串的相等性。我想确保我的所有条目在squeeze
下都是唯一的。
例如,假设我的Post
模型具有文本属性content
。我想确保如果foo bar
已经在数据库中,它不会接受foo bar
或foo bar
。有没有比添加自定义验证来迭代Post.all
更好的方法,squeeze
每个条目,并将其与squeeze
content
进行比较?我无法想象这能很好地扩展。
您可以在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
虽然你可能会尝试以"Rails"的方式完成所有事情,但在这种特殊情况下,我会走另一条路。如果出于某种原因您想将“foo bar”
内容保留在数据库中,只需引入一个新的字段squeezed_content
,实现一个post_commit
钩子以使用压缩值content
更新此字段,并暗示对该新引入的squeezed_content
字段进行验证,强制其是唯一的。
此外,您可能只是存储已经压缩的值。