Ruby on rails 如何向Rails中的ActiveRecord模型添加自定义唯一性验证?

Ruby on rails 如何向Rails中的ActiveRecord模型添加自定义唯一性验证?,ruby-on-rails,ruby,validation,rails-activerecord,Ruby On Rails,Ruby,Validation,Rails Activerecord,我在仔细阅读时,发现了这篇关于唯一性验证的简洁摘录: 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 还有一个:区分大小写的选项,可用于定义唯一

我在仔细阅读时,发现了这篇关于
唯一性
验证的简洁摘录:

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
还有一个:区分大小写的选项,可用于定义唯一性约束是否区分大小写。此选项默认为true

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


例如,假设我的
Post
模型有一个文本属性
content
。我想确保如果
foobar
已经在数据库中,它将不接受
foobar
foobar
。除了添加自定义验证来迭代
Post.all
screek
对每个条目进行压缩,并将其与
screek
内容进行比较外,还有更好的方法吗?我无法想象它能很好地扩展。

虽然您可能会尝试用“Rails”的方式完成所有事情,但在这种情况下,我会走另一条路。如果出于某种原因,您希望在数据库中保留
“foo bar”
内容,只需引入一个新字段
压缩内容
,实现一个
post_commit
hook,用压缩值
content
更新此字段,并对新引入的
compressed_内容
字段进行验证,使其唯一


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

虽然您可能尝试以“Rails”的方式完成所有操作,但在这种特殊情况下,我会选择另一种方式。如果出于某种原因,您希望在数据库中保留
“foo bar”
内容,只需引入一个新字段
压缩内容
,实现一个
post_commit
hook,用压缩值
content
更新此字段,并对新引入的
compressed_内容
字段进行验证,使其唯一


您也可以只存储已压缩的值。

您可以在
posts
表中添加另一列,名为
压缩的内容
或类似的内容,然后执行类似操作以使用内置唯一性验证:

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
class Post
您可以在
posts
表中添加另一列,名为
压缩内容
或类似内容,然后执行类似操作以使用内置唯一性验证:

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
class Post