我正在使用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
答案 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,通常只需添加一个模式来适应前缀。