我有一个相当典型的订单模型,即has_many
Lines
class Order < ActiveRecord::Base
has_many :lines
validates_associated :lines
订单完成后,将无法更改任何属性或相关行(尽管您可以将状态更改为未完成)。
validate do
if completed_at.nil? == false && completed_at_was.nil? == false
errors.add(:base, "You can't change once complete")
end
end
这可以正常工作,但是,如果您添加、删除或更改关联的Lines,那么这不会被阻止。
在我的Line模型中,我有以下验证:
validate do
if order && order.completed_at.nil? == false
errors.add(:base, "Cannot change once order completed.")
end
end
这成功地阻止了已完成订单中的行被修改,并防止将行添加到已完成的订单中。
所以我还需要防止从已完成的订单中取出行。我在Line模型中试过这个:
validate do
if order_id_was.nil? == false
if Order.find(order_id_was).completed_at.nil? == false
errors.add(:base, "Cannot change once order completed.")
end
end
end
这可以很好地防止在直接修改行时将行从订单中取出。但是,当您编辑Order并删除Line时,验证永远不会运行,因为它已从Order中删除。
所以...简而言之,我如何验证与订单关联的行没有更改,也没有添加或删除?
我在想我错过了一些明显的东西。