如何在 Rails 中向 ActiveRecord 模型添加自定义唯一性验证?



我正在仔细阅读Ruby on Rails Guides 关于 ActiveRecord 验证的文章,我看到了关于uniqueness验证的简洁摘录:

还有一个 :case_sensitive 选项可用于定义唯一性约束是否区分大小写。此选项默认为 true。

例如,这是一个非常有用的功能,可以确保两个用户不能使用相同的用户名或电子邮件进行注册。但是,我想使用类似的验证,但使用不同的方法来确定字符串的相等性。我想确保我的所有条目在squeeze下都是唯一的。

例如,假设我的Post模型具有文本属性content。我想确保如果foo bar已经在数据库中,它不会接受foo barfoo bar。有没有比添加自定义验证来迭代Post.all更好的方法,squeeze每个条目,并将其与squeezecontent进行比较?我无法想象这能很好地扩展。

您可以在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字段进行验证,强制其是唯一的。

此外,您可能只是存储已经压缩的值。

相关内容

  • 没有找到相关文章

最新更新