在rails中强制实现互斥字段的存在

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在rails中强制实现互斥字段的存在相关的知识,希望对你有一定的参考价值。

这段代码对我不起作用,但是调试器会触发,并且值是我对测试用例的期望值:

validates :a, :presence => false, :if => Proc.new { |f| debugger; f.b.present? }
validates :b, :presence => false, :if => Proc.new { |f| debugger; f.a.present? }

目标:ab不应该同时定义。

如果我理解语法,如果a存在,false的存在应该是b。和b类似。

我误解了吗?我确实相信数据是通过save!记录的......但是我已经确认正在调用验证。我在obj.save!obj.errors有一个空的messages哈希后立即查看了该对象。

答案

可能使这个更简单的事情是调用一个自定义验证,它只检查是否存在使用self而没有调用长度或创建一个proc。

validate :are_mutually_exclusive

private

def are_mutually_exclusive
  if self.a.present? && self.b.present?
    errors.add(:your_error_key, 'Values for A and B are mutually exclusive')
  end
end

如果您有分组值,这些也更容易管理。例如。允许A和B在一起,但C和A都不允许

if (self.a.present? || self.b.present?) && self.c.present?
另一答案

问题不在于'if'逻辑 - presence: falsepresence: true不相反

参考:Rails 3 Validation :presence => false

我最终使用:

validates :a, length: {is: 0}, if: Proc.new { |f| f.b.present? }
validates :b, length: {is: 0}, if: Proc.new { |f| f.a.present? }

以上是关于在rails中强制实现互斥字段的存在的主要内容,如果未能解决你的问题,请参考以下文章

LockSupport.java 中的 FIFO 互斥代码片段

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

Rails 使用时区参数和 DST 强制执行 DateTime 偏移

当表单中存在文件字段时,Rails 不发出 Ajax 请求

即使存在未设置为true,Rails验证也需要数值

互斥锁 & 共享锁