Mam dość typowy Zamówienie modelu, który has_many
LinieJak mogę potwierdzić, że stosunki has_many nie są zmieniane
class Order < ActiveRecord::Base
has_many :lines
validates_associated :lines
Gdy zamówienie jest zakończone, to nie powinno być możliwe, aby zmienić atrybuty lub powiązane linie (choć możesz zmienić status, aby nie został ukończony).
validate do
if completed_at.nil? == false && completed_at_was.nil? == false
errors.add(:base, "You can't change once complete")
end
end
Działa to dobrze, aleJeśli dodawać, usuwać lub zmieniać związane Lines, to nie jest niemożliwe.
W moim linii modelu, mam następujący Walidacja:
validate do
if order && order.completed_at.nil? == false
errors.add(:base, "Cannot change once order completed.")
end
end
ten skutecznie zatrzymuje linie wypełnionego zamówienia została zmodyfikowana i zapobiega linia dodawane do wypełnionego zamówienia.
Muszę również zabezpieczyć linie przed usunięciem z kompletnego zamówienia. Próbowałem to w modelu linia:
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
Działa to dobrze, aby zapobiec Linia wycofywana o Zakonu podczas modyfikacji Linia bezpośrednio. Jednak podczas edytowania Zamówienie i usunąć linii, sprawdzanie poprawności nigdy nie działa, ponieważ zostało już usunięte z Zamówienie.
... Tak w skrócie, jak mogę potwierdzić, że Linie związane ze Zakonu nie zmieniają i nie są dodawane lub usuwane?
Myślę, że brakuje mi czegoś oczywistego.
Ah, to jest bliskie ideału. Dziękuję Ci. Chciałbym, aby powodowało błąd, a nie wyjątek, jeśli jest to możliwe, jak sugerujesz na końcu, jednak dodanie błędu/zwrócenie false nie działa. Jeśli masz dalsze przemyślenia na ten temat, byłoby wspaniale. Zauważ, że polecenie before_add/remove przekazuje wiersz w args, więc jest to 'validate_editable! (Line)'. – Colin
Krótki google wydaje się pokazywać, że nie da się tego zrobić ... więc myślę, że jest to sposób na wymuszenie tego, ale potrzebuję też czegoś w kontrolerze. – Colin
Masz rację, pojawia się. Prawdopodobnie możesz rzucić własny wyjątek i "uratować" go w kontrolerze. Nadal będzie całkiem czysty. –