Zwei Modelle, ein STI und eine Validierung
-
23-09-2019 - |
Frage
Nehmen wir an, ich habe zwei Tische - Produkte und Bestellungen. Nehmen Sie zur Einfachheit an, dass jeweils nur ein Produkt gekauft werden kann, sodass es keine Join -Tabelle wie Order_items gibt. Die Beziehung besteht also aus, dass das Produkt viele Bestellungen hat und Reihenfolge zum Produkt gehört. Daher ist Product_id ein FK in der Bestellentabelle.
Die Produkttabelle ist sti - wobei die Unterklassen a, b, C. sind
Wenn der Benutzer unter Klassenprodukt C ordnet, müssen zwei spezielle Validierungen auf den Bestellmodellfeldern order_details und order_status überprüft werden. Diese beiden Felder können für alle anderen Produktunterklassen (dh A und B) nicht null sein. Mit anderen Worten, keine Validierung muss für diese beiden Felder ausgeführt werden, wenn ein Benutzer a und B. kauft
Meine Frage ist:
Wie schreibe ich Validierungen (vielleicht benutzerdefiniert?) Im Auftragsmodell, damit das Bestellmodell nur die Validierungen für seine beiden Felder ausführen kann - Order_details und Order_Status -, wenn die FK_ID zu Produkt -Unterklasse C in der Bestellentabelle gespeichert wird ?
Lösung
Der Schlüssel ist, a hinzuzufügen validate
Methode in der Order
Modell, um nach Einzelheiten zu suchen:
def validate
if product and product.type_c?
errors.add(:order_details, "can't be blank") if order_details.blank?
# any other validations
end
end
Oder etwas in dieser Richtung. Überprüfen Sie einfach den Typ in validate
und fügen Sie die entsprechenden Fehler hinzu. Ich habe gerade das erfunden type_c?
Funktion. Überprüfen Sie einfach den Typ, aber Ihr Product
Modell ist definiert.