0

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

该产品将能够从原始 url 和自定义 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

4

2 回答 2

1

一个超级简单的 hack 是为 original_url 和 custom_url 添加一个唯一的前缀

比如说,你原来的 original_url 是 6 位数字,比如 'foobar',那么新的 origina_url 将是 'ofoobar'。如果生成 custom_url,则应以“c”开头,即“cfoobar”。

这样,您只需要分别验证 origina_url 和 custom_url ,通常只需添加一个模式以适应前缀。

于 2013-08-29T06:42:10.347 回答
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

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

于 2013-08-29T06:36:21.500 回答