2010-07-27 5 views
0

Cela devrait être facile. Je ne sais pas exactement comment titre la question si. J'ai une collection de modules qui peuvent être ajoutés à mon CMS (page, lien, formulaire ...) ils sont tous associés via une association polymorphe à une table qui gère des choses communes comme l'ascendance et si elles sont activées etc. Parce que je crée une "page" par exemple, je gère automatiquement la création de cet autre enregistrement de table. Tout ce que j'ai besoin de lui transmettre est le parent_id. Pour ce faire, je l'ai créé une procuration par le modèle de page:Comment stocker un ID dans une classe de modèle

def parent_id=(parent_id) 
    @parent_id = parent_id.blank? ? nil : parent_id.to_i 
    component_instance.parent_id = @parent_id 
    end 

    def parent_id 
    @parent_id ||= component_instance.parent_id 
    end 

component_instance est l'association polymorphique.

Vous pouvez voir que lorsque le parent_id est défini sur la page, je fais un peu de magie pour voir s'il est vide et si oui, définissez la valeur @parent_id à zéro, sinon je le transforme en entier, puis Assignez-le à l'instance component_instance qui l'appliquera si nécessaire lorsque l'ensemble de la combo page/component_instance est enregistré dans la base de données.

J'ai dû faire la chose blank? nil : parent_id.to_i parce que l'assistant de sélection de formulaire attend un nombre entier et ne fonctionne pas avec une valeur de chaîne pour l'ID. La question est, est-ce que je le fais de la bonne façon, ou y a-t-il un meilleur moyen de transformer un identifiant de chaîne en un nil ou un entier selon qu'il existe ou pas?

+0

Pourquoi votre parent_id serait-il une chaîne? Quelque chose ne s'ajoute pas ici. – jdl

+0

Parce que ça vient du hash des params. Tout dans params est passé comme une chaîne n'est-ce pas? –

Répondre

0

Je fini par déléguer la mise de ces « virtuel » des attributs du modèle réel où ils étaient « réel »:

delegate :parent_id, :parent_id=, :to => :component_instance, :allow_nil => true 

Saves la nécessité de typer l'attribut premier.

Questions connexes