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

时间:2017-09-18 19:37:37

标签: ruby-on-rails ruby-on-rails-3.2

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

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哈希值。

2 个答案:

答案 0 :(得分:1)

可以简化此操作的是调用自定义验证,该验证仅使用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允许一起使用,但C不允许A或B

if (self.a.present? || self.b.present?) && self.c.present?

答案 1 :(得分:0)

问题不在于'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? }