在两个单独的列

时间:2016-06-15 18:11:10

标签: ruby-on-rails validation activerecord

我需要验证两个字段的唯一性。

模型

: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记录)。这些字段已编入索引,所以我希望这已经足够了。

知道最好的方法是什么?

2 个答案:

答案 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好一点?在大型样本集上或您可能获得匹配的地方。