Rails 3使用范围条件进行验证

时间:2012-04-18 19:22:16

标签: ruby-on-rails-3

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

我需要验证才能检查:

validates :approver_note, :presence => true, {:scope => state_id == 3}
validates :po_number, :presence => true, {:scope => state_id ==2}

因此,如果用户选择state_id = 3,则必须输入注释。 如果他选择state_id = 2,他必须输入一个po_number。

任何帮助都会很棒......谢谢!

1 个答案:

答案 0 :(得分:7)

您正在寻找:if选项,而不是:scope

validates :approver_note, :presence => true,
  :if => lambda { |invoice| invoice.state_id == 3 }

但是因为lambda有点难看,我可能会添加一种方法来封装你做得更好的东西:

validates :approver_note, :presence => true, :if => :requires_note?
validates :po_number, :presence => true, :if => requires_po_number?

def requires_note?
  state_id == 3
end

def requires_po_number?
  state_id == 2
end

如果你state_id为3时实际上有一堆不同的属性,而不仅仅是一个音符,那么你可能需要这样的东西:

validates :approver_note, :presence => true, :if => :green_state?
validates :po_number, :presence => true, :if => orange_state?

def green_state?
  state_id == 3
end

def orange_state?
  state_id == 2
end

(将“绿色”替换为 - 我不知道 - “high_documentation”或在您的世界中有意义的任何内容。)

或许你想让国家决定它是什么:

def green_state?
  state.green?
end

确实有助于使代码中的术语更贴近您的真实语言,而不是“3”和“2”。