跳过 nil 类 Rails 3 的唯一性验证



目前,我无法创建具有 nil 值的空字段,因为 nil 算是唯一的。我想做的是,如果字段有值,那么它必须是唯一的,如果 nil 那么不是,它也不能返回空字符串值。

这是我的验证:

validates :subdomain, :allow_nil => true, uniqueness: true

更新

通过此验证,我收到一条错误消息:

子域不能为空

validates_uniqueness_of :subdomain, presence: true, allow_nil: true, if: -> (x) { x.subdomain.present? }

在控制台中没有"presence: true",我可以创建具有子域 nil 值的记录,但是如果我在浏览器中执行此操作,它会创建具有空字符串的子域。

正如@Pavan在评论中所说,您需要有条件地运行此验证。

由于:allow_nil选项,nil是可接受的值;但是,除非您添加其他检查,否则它仍将针对此值运行唯一性测试。

我将使用以下代码:

validates :subdomain, allow_nil: true, uniqueness: true, if: -> (x) { x.subdomain.present? }

首先,我觉得present?是一个很好的、可读的方式来包含它。

有了这个,我 99% 确定您还可以简单地使用:allow_nil选项:

validates :subdomain, uniqueness: true, if: -> (x) { x.subdomain.present? }

希望有帮助 - 让我知道你是如何相处的,或者你是否有任何问题。


根据注释进行编辑,下面是一个拒绝空字符串的示例:

validates :subdomain, allow_nil: true, uniqueness: true, presence: true, if: :subdomain
# or
validates :subdomain, uniqueness: true, presence: true, if: :subdomain

同样,不要认为您将需要其中的:allow_nil:我已经更新了条件,因此验证仅在record.subdomain上运行,这将为空字符串返回truefalse返回nil

我的解决方案:

控制器创建方法

@organisation = Organisation.new(params[:organisation].delete_if{ |key, value| !value.present? })

在模型中:

validates   :subdomain, :allow_nil => true, uniqueness: true

相关内容

  • 没有找到相关文章

最新更新