7
votes

Les attributs imbriqués peuvent-ils être utilisés en combinaison avec héritage?

J'ai les classes suivantes:

  • projet
  • personne
  • personne > développeur
  • personne > manager

    dans le modèle J'ai ajouté les instructions suivantes: xxx

    et bien sûr les déclarations appropriées dans la classe < code> personne . Comment puis-je ajouter un développeur à un projet via le niché_attributes méthode? Ce qui suit ne fonctionne pas: xxx

    Comme vous pouvez le voir (code> type est défini sur nil au lieu de "Développeur" .


0 commentaires

4 Réponses :


5
votes

J'ai rencontré un problème similaire il y a quelques jours. La colonne d'héritage (i.e. type ) dans un modèle STI est un attribut protégé. Effectuez ce qui suit pour remplacer la protection par défaut dans votre classe de la classe

rails 2.3 xxx

Rails 3

Reportez-vous au Solution suggéré par @tokland .

CAVEAT:

Vous prenez l'attribut protégé du système .

Référence:

Donc, question sur le sujet


4 commentaires

Remarque: cela fonctionne pour les rails 2.3, voir ma réponse ci-dessous pour les rails 3


@tokland, je n'avais pas visité cette question depuis un jour. J'ai mis à jour ma réponse avec une solution Rails 3.


super. J'écrirais un simple def auto.Attributes_protetit_by_default , mais quoi que ce soit.


@tokland, vous avez raison sur la méthode de la classe est plus facile. Lorsque je testais cette approche, comme j'avais un objet d'objet / classe funky dans ma session IRB et que l'appel super n'a pas fonctionné.



4
votes

Les patchs ci-dessus n'ont pas fonctionné pour moi, mais cela a fait (Rails3): xxx

foo.bars.build (: type => 'Baz'). Classe == Baz


1 commentaires

Cette solution fonctionne pour les associations, mais pas pour se tenir debout le long de la construction d'objets STI. J'ai mis à jour ma réponse avec une solution de Rails génériques 3.



7
votes

solution pour rails3 : attributes_protected_by_default dans maintenant une méthode de classe: xxx


1 commentaires

Remarque: assurez-vous de mettre cela près du sommet de la classe, avant n'importe quel appels vers ATTR_PROTECTEZ . Le premier appel à attr_protég entraînera de l'appeler quelle que soit la version de attributs_proteint_by_default est actuellement définie, qui sera la version par défaut de AR sauf si vous ne l'avez pas annulé par ce point. ..



0
votes

Pour ceux d'entre nous à l'aide de Mongoid, vous devrez faire le champ _type code> accessible:

class Person
  include Mongoid::Document
  attr_accessible :_type
end


0 commentaires