我有一个带有approver_note,po_number和state_id的发票模型.
我需要验证来检查:
validates :approver_note, :presence => true, {:scope => state_id == 3}
validates :po_number, :presence => true, {:scope => state_id ==2}
Run Code Online (Sandbox Code Playgroud)
因此,如果用户选择state_id = 3,则必须输入注释.如果他选择state_id = 2,他必须输入一个po_number.
任何帮助都会很棒......谢谢!
你正在寻找的:if选择,而不是:scope.
validates :approver_note, :presence => true,
:if => lambda { |invoice| invoice.state_id == 3 }
Run Code Online (Sandbox Code Playgroud)
但是由于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
Run Code Online (Sandbox Code Playgroud)
如果你实际上有3个不同的属性state_id,而不仅仅是一个音符,那么你可能需要这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
(将"绿色"替换为 - 我不知道 - "high_documentation"或在您的世界中有意义的任何内容.)
或许你想让国家决定它是什么:
def green_state?
state.green?
end
Run Code Online (Sandbox Code Playgroud)
它确实有助于使代码中的术语更贴近您的真实语言,而不是"3"和"2".