2010-04-01 3 views
4

Disons que j'ai deux tables - Produits et commandes. Par souci de simplicité, supposons qu'un seul produit puisse être acheté à la fois, il n'y a donc pas de table de jointure comme order_items. Donc, la relation est que le produit a beaucoup de commandes, et l'ordre appartient au produit. Par conséquent, product_id est un fk dans la table Order.Deux modèles, un STI et une validation

Le tableau produit est STI - avec les sous-classes étant A, B, C.

Lorsque l'utilisateur commande sous-classe produit C, deux validations spéciales doit être vérifié sur les champs de modèle d'ordre Order_Details et ORDER_STATUS. Ces deux champs peuvent être nuls pour toutes les autres sous-classes de produits (c.-à-d. A et B). En d'autres termes, aucune validation doit fonctionner pour ces deux champs lorsqu'un utilisateur achète A et B.

Ma question est:

Comment puis-je écrire des validations (? Peut-être personnalisés) dans le modèle de commande afin que la Le modèle de commande sait qu'il exécute uniquement les validations pour les deux champs ITS - order_details et order_status - lorsque la sous-classe fk_id to Product est enregistrée dans la table des commandes?

+0

Existe-t-il une alternative à l'utilisation du polymorphisme ici? – keruilin

+0

ouais ... voir mes modifications à nouveau :) Il s'est juste aperçu sur ce que vous étiez vraiment après. Pour les questions futures, il pourrait être préférable d'inclure le code du modèle réel. Cela m'aurait aidé dès le début (là encore j'étais partout, donc ça aurait pu être juste moi :) –

+0

oui, ne pense pas que c'est toi! c'était ma déclaration de prob original. Merci pour votre aide. – keruilin

Répondre

4

La clé est d'ajouter une méthode validate dans le modèle Order pour vérifier les détails:

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 

Ou quelque chose dans ce sens. Vérifiez simplement le type dans validate et ajoutez les erreurs appropriées. Je viens de composer la fonction type_c?. Vérifiez simplement le type mais votre modèle Product est défini.

+0

Tony, cela fonctionnera-t-il encore si les champs order_details et order_status sont dans le modèle Order? – keruilin

+0

Ah désolé ... voir modifier –

Questions connexes