5

我有一个带有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。

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

4

1 回答 1

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_id3 时需要的不同属性,而不仅仅是一个注释,那么您可能想要这样的东西:

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”相反,它确实有助于使您的代码中的术语更贴近您的实际语言。

于 2012-04-18T20:00:10.230 回答