【问题标题】:Skip uniqueness validation for nil class Rails 3跳过零类 Rails 3 的唯一性验证
【发布时间】:2018-10-18 08:18:52
【问题描述】:

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

【问题讨论】:

  • 试试validates :subdomain, :allow_nil => true, uniqueness: true, if: '!subdomain.nil?'
  • 也许您对数据库级别有独特的约束?尝试保存具有 nil 值的第二条记录时遇到哪个错误?
  • 无子域简单字符串。错误消息:“子域已被占用”

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


【解决方案1】:

正如@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

【讨论】:

  • 它几乎可以工作,只是它使用空字符串创建记录,而不是 nil 值。
  • 感谢@Kristis 的更新——在这种情况下,请确保您有:allow_nil,并将presence: true 添加到选项中。这样nil 将被允许,但空字符串不会。我会用一个完整的例子来更新我的答案:)
  • 子域已被占用,子域不能为空。我通过这个验证得到这个:验证:subdomain,allow_nil:true,uniqueness:true,presence:true,if::subdomain
  • 你能帮我把问题中控制器收到的表单和参数贴出来吗?我得冲刺一下,不过如果你加上这个,很可能有人能帮忙,或者我回来时可以。
【解决方案2】:

我的解决方案:

控制器创建方法

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

在模型中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多