跳过零级Rails 3的唯一性验证

时间:2018-10-18 08:18:53

标签: ruby-on-rails ruby-on-rails-3 validation null

当前,我无法使用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值创建记录,但是如果在浏览器中执行此操作,它将创建具有空字符串的子域。

2 个答案:

答案 0 :(得分:1)

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

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

我将使用以下代码:

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

通常,我认为present?是包含此内容的一种很好的可读方式。

有了这一点,我敢肯定您还可以通过简单地使用以下方法取消: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

答案 1 :(得分:0)

我的解决方案:

控制器创建方法

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

和型号中:

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