使用真实命名范围rails进行验证

时间:2015-11-24 09:56:54

标签: ruby-on-rails ruby-on-rails-3

我有一个发票模型,包含approver_note,po_number和state_type。

我需要验证才能检查:

scope :approver, where(state_type: 3)
scope :po_no, where(state_type: 2)

validates :approver_note, :presence => true, uniqueness: { scope: [:ac_id, :approver]}, if: :state_three?
validates :po_number, :presence => true, uniqueness: { scope: [:ac_id, :po_no]}, if: :state_two?

def state_three?
    self.state_type==3
end

def state_two?
    self.state_type==2
end

如何确保approver_note验证程序中的唯一性在选定的记录范围内运行。它应该使用state_type = 3的记录进行验证。

我需要与此错误相似的内容......

https://rails.lighthouseapp.com/projects/8994/tickets/4325-real-scope-support-for-activerecords-uniqueness-validation

现在可以在rails中使用吗?或者我们可以使用自定义验证来实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

scope的{​​{1}}选项会检查表中两列值的组合是否为uniq,坦率地说,我真的不知道应用动态是多么聪明范围。即使是铁轨也太神奇了!

然而,自定义验证器非常简单:

uniquness

附加信息:

除此之外,我看到条件选项在Rails 4的validate_uniqueness_of中可用。我们可以使用它并构建两个验证,一个用于存在,一个用于唯一性。以防万一有人在Rails 4中寻找答案。

如果是Rails 4,

validate :approver_note_scoped_uniqueness, if: :state_three?

def approver_note_scoped_uniqueness
  if self.class.approver.where(ac_id: ac_id).count > 0
    errors.add(:ac_id, "My custom error message")
  end
end