【发布时间】:2025-12-25 07:50:06
【问题描述】:
所以工作中出现了一种情况,我想在这里讨论一下,因为我们之间无法达成协议:
我们有两个模型,Order 和 Passport,它们的关联方式是 Order has_one passport 和 passport has_many orders。每当订单完成时,其关联的护照必须被“锁定”,即变为只读(该信息已用于清关,因此以后无法更改)。我们希望在 Passport 模型中强制执行该规则,并且我们考虑了以下选项:
-
创建验证。缺点:当技术上记录很好时(尽管无法保存),会有记录产生
valid? => false。例如,如果其他记录上有validates_associated :passport,这可能是个问题。 -
覆盖
readonly?方法。缺点:尝试更新该记录时,这会引发异常,尽管您会认为调用save方法永远不会引发异常。 -
创建
before_save回调。这有两种风格:要么引发异常(这很像readonly?选项),要么添加@error并返回false以停止回调链。缺点:从正确的验证之外添加验证错误可能被认为是一种不好的做法。此外,您可能会发现自己调用valid?并获得true,然后调用save并获得false。
这种情况让我们思考了很多关于验证和 Rails 之间的关系。记录为valid? 究竟意味着什么?这是否意味着save 会起作用?
我想听听您的意见以了解这种情况。也许最好的方法不是三者之一!谢谢!
【问题讨论】:
标签: ruby-on-rails ruby validation activerecord