唯一性验证,除非是亲子关系的一部分

时间:2018-02-07 11:54:50

标签: ruby-on-rails activerecord

我正在开发一个项目,我有一个名为transaction的模型。使用密钥transactionparent_transaction_id可以有许多子事务。亲子关系只能是一层深,所以孩子不能拥有自己的孩子。

transaction还有一个名为reference_number的属性我希望此属性是唯一的,除了父子关系之外。因此父母和孩子可以拥有相同的reference_number,但两个不相关的交易不能。我目前有:

validate :reference_number, uniqueness: true, allow_blank: true

我原本以为在验证时会有unless: -> { is_parent_child }条件,但似乎不可能用这种方法做我想做的事。

任何寻找方法的帮助都将非常感激。

1 个答案:

答案 0 :(得分:0)

有一个解决方案是编写自定义验证,如下所示:

validate :reference_number_uniq

def reference_number_uniq
  if self.reference_number && self.exists?('id != ? AND reference_number = ?', 
    self.child_transaction_id, 
    self.reference_number)
    errors.add(:reference_number, "is not valid")
  end
end

使用unless可能有效,但在验证reference_number的唯一性之前可能需要再执行一次查询。