2008-10-01 10 views
0

Cette question est basée sur another question of mine (heureusement répondu).Injecter des membres de données à un objet

Donc, si dans un modèle que j'ai ceci:

def self.find_extended 
    person = Person.find(:first) 
    complete_name = person.firstname + ', ' + person.lastname 
    return person 
end 

Comment puis-je injecter le nom complet dans l'objet personne ainsi dans mon contrôleur/vue, je peux y accéder par person.complete_name?

Merci pour votre temps,
Silviu

Répondre

6

Je pense que la meilleure façon de faire est création de l'attribut complete_name dans votre classe Person:

def complete_name 
    firstname + ', ' + lastname 
end 
1

Vous pouvez définir:

attr_accessor :complete_name 

dans le modèle de personne et puis juste faire person.complete_name= person.firstname + ', ' + person.lastname

+0

Votre réponse était tout aussi bonne pour moi mais j'ai trouvé que la solution d'IDBD était plus élégante –

1

En outre, une autre note rapide. Vous n'avez pas besoin de cette déclaration de retour dans Ruby. La dernière instruction de votre méthode sera renvoyée.

2

Si vous comptez parcourir de nombreux enregistrements, l'utilisation d'une chaîne interpolée sera plus efficace en termes de mémoire.

def complete_name 
    "#{firstname}, #{lastname}" 
end 

En utilisant String#+ à cordes concaténer crée des objets String à chaque étape. En d'autres termes, si firstname est 'John' et lastname est 'Doe', chacun de ces chaînes existera en mémoire et doivent être ordures collectées à un moment donné: 'John', 'Doe', 'John, ', et enfin 'John, Doe'. Sans mentionner qu'il y a trois invocations de méthodes au lieu d'une interpolation de chaîne qui est implémentée plus efficacement dans C.

Si vous utilisez la notation #{}, vous évitez de créer la chaîne 'John, '. Peu importe lorsque vous traitez avec un ou deux enregistrements, mais dans les grands ensembles de données utilisés dans toutes sortes de méthodes, il peut s'additionner rapidement.

Questions connexes