验证两列本身是唯一的,也是彼此唯一的

时间:2013-08-29 06:20:15

标签: ruby-on-rails ruby activerecord

我正在使用Rails应用程序,当用户创建产品时,该产品会在original_url列中获得一个随机网址。用户稍后可以选择自定义网址,该网址将保存在custom_url

可以从原始网址和自定义网址访问该产品。我无法弄清楚如何保持列不仅在它们之间是独一无二的,而且在彼此之间也是如此。我确实发现了:scope,但这并没有实现我的想法。

不可能发生的事例:

original_url: Ab | custom_url: nil

original_url: Bc | custom_url: Ab

另一个不可能发生的例子:

original_url: Ab | custom_url: nil

original_url: Ab | custom_url: nil

可能发生的事情的例子:

original_url: Ab | custom_url: nil

original_url: Bc | custom_url: De

original_url: Gh | custom_url: nil

2 个答案:

答案 0 :(得分:1)

也许最好的选择是编写自定义验证块/方法,例如:

validate do
  if Product.where(original_url: original_url, custom_url: original_url).size > 0 ||
    Product.where(original_url: custom_url, custom_url: custom_url).size > 0
  errors.add(:base, 'Original url and custom url must be unique.')
end

另一种解决方案是为网址创建模型,然后让Product has_many :urls

答案 1 :(得分:1)

超级简单的黑客是为original_url和custom_url

添加唯一的前缀

说,你原来的original_url是6位数,就像'foobar',然后新的origina_url将是'ofoobar'。而custom_url,如果生成,应该以“c”开头,即“cfoobar”。

这样你只需要单独验证origina_url和custom_url,通常只需添加一个模式来适应前缀。