目前,我无法创建具有 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
上运行,这将为空字符串返回true
,false
返回nil
。
我的解决方案:
控制器创建方法
@organisation = Organisation.new(params[:organisation].delete_if{ |key, value| !value.present? })
在模型中:
validates :subdomain, :allow_nil => true, uniqueness: true