在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? }
目标:a
和b
不应该同时定义。
如果我理解语法,如果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: false
与presence: 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 注入的影响?