【发布时间】:2016-08-08 00:06:19
【问题描述】:
所以我有一个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 验证,它可以用数组做我想要的,我不想浪费时间构建和取消构建数组。最后,我考虑了将正则表达式实际存储在数据库中的方法,但看起来无论哪种方式我都必须从字符串中构建正则表达式。
【问题讨论】:
-
您当前需要优化的代码有多慢?
标签: ruby-on-rails ruby postgresql validation activerecord