我需要验证两个字段的唯一性。
模型
:name
:original_url #(this cannot match any url or original_url)
:url #(this cannot match any url or original_url)
我可以单独验证每一个
validates_uniqueness_of :name, scope: {:url, :original_url}
但我无法弄清楚我如何能够抵御这两个领域。我也很关心性能(该表有2m记录)。这些字段已编入索引,所以我希望这已经足够了。
知道最好的方法是什么?
答案 0 :(得分:0)
执行此操作的最佳方法是在数据库级别和Rails模型中。我可以用后者帮助你,希望有人可以通过SQL来解释如何添加它。我将这个保留在“模型”上下文中,因为你没有指定名称:
在你的model.rb文件中:
validate :ensure_unique_for_both_cols
def ensure_unique_for_both_cols
if self.original_url || self.url
#Ensure no record matching this exists in either field
unless Model.where("original_url = ? OR url = ?",self.original_url, self.url).empty?
self.errors.add(:base, "The url must be unique!")
end
end
end
答案 1 :(得分:0)
感谢上面的bkunzi指出我在正确的轨道上。
验证:ensure_urls_unique
def ensure_urls_unique
urls = [self.url, self.original_url].compact # To allow 'nil' to match
if Job.where("original_url IN (?) OR ad_url IN (?)",urls, urls).where(name:self.name).where.not(id:self.id).exists?
self.errors.add(:base, "The urls must be unique!")
else
return true
end
end
值得注意的是.exists?表现得比.empty好一点?在大型样本集上或您可能获得匹配的地方。