J'ai les classes suivantes:
dans le modèle code> code> J'ai ajouté les instructions suivantes: p> et bien sûr les déclarations appropriées dans la classe < code> personne code>. Comment puis-je ajouter un Comme vous pouvez le voir (code> type code> est défini sur développeur code> à un projet code> via le niché_attributes code> méthode? Ce qui suit ne fonctionne pas: p> nil code> au lieu de "Développeur" code>. P> p>
4 Réponses :
J'ai rencontré un problème similaire il y a quelques jours. La colonne d'héritage (i.e. rails 2.3 strong> p> Rails 3 strong> P> Reportez-vous au Solution suggéré par @tokland . p> CAVEAT: strong> p> Vous prenez l'attribut protégé du système . P> type code>) dans un modèle STI est un attribut protégé. Effectuez ce qui suit pour remplacer la protection par défaut dans votre code> classe code> de la classe code>
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 code>, 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 code> n'a pas fonctionné.
Les patchs ci-dessus n'ont pas fonctionné pour moi, mais cela a fait (Rails3): foo.bars.build (: type => 'Baz'). Classe == Baz p> p>
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.
Remarque: assurez-vous de mettre cela près du sommet de la classe, avant i> n'importe quel appels vers ATTR_PROTECTEZ code>. Le premier appel à attr_protég code> entraînera de l'appeler quelle que soit la version de attributs_proteint_by_default code> est actuellement définie, qui sera la version par défaut de AR sauf si vous ne l'avez pas annulé par ce point. ..
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