有效地验证文本字段元素的唯一性

时间:2016-08-08 00:06:19

标签: ruby-on-rails ruby postgresql validation activerecord

所以我有一个product模型,其文本属性为换行符tags。这背后的原因是每天运行一个查询,遍历每个字段,按产品构建正则表达式,我希望尽可能快。产品每隔几个月才会添加或更新一次,因此验证不需要同样有效,但我希望能够达到先前的限制。

到目前为止,我提出的是:

def build_regex_string
  '(' + tags.gsub(/(\r?\n(?!$))/,'|').gsub(/(\r?\n)/,'') + ')'
end

def validate_tags_are_unique
  Product.where.not(id: id).each do |product|
    tags_regex = Regexp.new(product.build_regex_string)
    return false if tags_regex.match(tags)
  end
end

我使用正则表达式主要是因为它是我已有的方法。我试图研究将验证直接写入pSQL中的迁移是否更好?我并不精通。我调查的另一件事是使用数组类型,但我还没有找到一个ActiveRecord验证,它可以用数组做我想要的事情而且我不想浪费时间构建和取消构建数组。最后,我考虑了将正则表达式实际存储在数据库中的方法,但看起来我要用字符串构建正则表达式。

1 个答案:

答案 0 :(得分:0)

为什么不使用Ruby呢?它在Ruby中非常简单。

def validate_tags_are_unique
  self_tags = tags.split(/\n/)
  Product.where.not(id: id).tags.all?{ |t| (self_tags - t.split(/\n/)).empty? }
end