私はかなり典型的な注文モデルを持っていhas_many
ます。
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からすでに削除されているため、検証は実行されません。
つまり...要するに、注文に関連付けられた明細が変更されず、追加または削除されないことをどのように検証できますか?
明らかな何かが欠けていると思います。