2010-09-15 11 views
-1

je le scénario suivantImplémenter STI où la classe parente n'a pas de contrôleur propre est juste un modèle et a une relation avec d'autres modèles. Rails STI

class XYZ < ActiveRecord::Base 
has_many :abcs 
end 

class ABC < ActiveRecord::Base 
belongs_to :xyz 
end 

class A < ABC 
end 

class B < ABC 
end 

class C < ABC 
end 

Le modèle ABC n'a pas de contrôleur, ou la vue. Les données relatives à ABC seront insérées à partir des vues et des contrôleurs XYZ. L'utilisateur définit une valeur de type pour ABC qui peut être A, B ou C.

Et selon le type, la sous-classe STI correspondante doit être instanciée et les données doivent être enregistrées de manière appropriée. Mais ici les sous-classes ne sont pas instanciées, les données sont parfaitement sauvegardées. Mais je le fais de la mauvaise façon car j'ai écrit le code des sous-classes dans la classe STI parent parce que ce code n'était pas appelé dans la sous-classe.

Veuillez donner des suggestions et fournir des solutions ou des tutoriels.

Merci d'avance.

+0

Je ne peux pas extraire ce que vous voulez, mais accepte probablement_attributs_pour_effectue ce que vous voulez? – Reactormonk

+0

J'espère que cela vous aidera à mieux comprendre. Considérez un CMS qui pourrait avoir Page, NewsItem, BlogItem etc. Ils pourraient chacun descendre d'une classe commune qui à son tour hérite d'ActiveRecord. La table pour chacun serait la même (title, body, tags, published_at) mais chaque modèle pourrait avoir des associations différentes, ou des statuts différents, ou un flux de travail différent donc chacun a du code personnalisé dans sa propre classe. Pourtant, ils partagent tous une table commune et la classe parente. Cela me permet également d'utiliser la classe parente pour faire une recherche de classe croisée et de faire en sorte que le tableau résultant des enregistrements tape automatiquement. – Rohit

+0

J'ai ajouté le code personnalisé dans les classes enfants, mais je ne suis pas en mesure de trouver un moyen d'instancier la classe enfant afin d'exécuter le code à l'intérieur. En utilisant le mécanisme accepts_nested_attributes_for, vous acceptez les attributs de la classe parente, mais vous ne pouvez pas séparer les classes enfants. Et c'est mon problème. J'espère que vous avez une idée plus claire de mon problème maintenant. :) – Rohit

Répondre

0

Assurez-vous que le modèle ABC possède un attribut type et qu'il est défini correctement sur "A", "B" ou "C" lorsque vous enregistrez des instances de ces classes.

ABC.find et les amis doivent alors retourner des instances de la classe respective.

Lors de la création de nouveaux objets, vous aurez bien sûr besoin de code dans votre contrôleur pour appeler new sur la sous-classe correcte en fonction de certains paramètres d'entrée.

+0

J'ai une colonne de type où le type est en train d'être défini. Je ne comprends pas comment exécuter le code personnalisé présent dans les classes d'ITS enfant. Veuillez montrer le moyen d'exécuter cette partie du code qui est présente dans les classes d'ITS enfant. – Rohit

+1

@Rohit: Quel genre de code? Méthodes de classe, méthodes d'instance ou code dans la définition de classe? Comment et d'où appelez-vous ce code? Vous devrez fournir quelques exemples. –

+0

Ce sont des méthodes d'instance qui sont présentes dans les classes STI enfants. – Rohit