在 rails 中强制存在互斥字段
Enforce mutually exclusive fields' presence in 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
绝不能同时定义。
如果我理解语法,如果 b
存在,a
的存在应该是 false
。与 b
.
类似
我是不是误会了?我确实相信数据是通过 save!
记录的。但是我已经确认正在调用验证。我在 obj.save!
之后立即查看了对象,并且 obj.errors
有一个空的 messages
散列。
问题不在于 '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? }
可能使这更简单的方法是调用自定义验证,该验证仅使用 self 检查是否存在任何一个,而无需调用 length 或创建 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 允许在一起,但 A 或 B 都不允许与 C
if (self.a.present? || self.b.present?) && self.c.present?
此代码对我不起作用,但调试器会触发,并且值是我对测试用例的期望值:
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
绝不能同时定义。
如果我理解语法,如果 b
存在,a
的存在应该是 false
。与 b
.
我是不是误会了?我确实相信数据是通过 save!
记录的。但是我已经确认正在调用验证。我在 obj.save!
之后立即查看了对象,并且 obj.errors
有一个空的 messages
散列。
问题不在于 '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? }
可能使这更简单的方法是调用自定义验证,该验证仅使用 self 检查是否存在任何一个,而无需调用 length 或创建 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 允许在一起,但 A 或 B 都不允许与 C
if (self.a.present? || self.b.present?) && self.c.present?