2011-05-13 5 views
9

Comment puis-je obtenir l'attribut de l'objet modèle dynamiquement? Je l'attribut de l'objet utilisateur sous forme de chaîne:Obtenir dynamiquement un attribut de modèle dans les rails 3

u = User.find(1) 

Puis-je faire quelque chose comme u.get("user_id")

+0

Je ne comprends pas tout à fait cette question. Qu'est-ce que vous essayez de faire exactement? –

+0

N'hésitez pas à accepter une réponse de certaines données ci-dessous si vous êtes heureux? Pas proche de ce dont vous avez besoin? –

+1

Si vous parlez seulement des objets ActiveRecord (comme dans l'exemple de code), vous devriez probablement être plus explicite à ce sujet dans le titre et la question. (Je ne m'en suis rendu compte que lorsque j'ai essayé la réponse.) La réponse choisie traitant le modèle comme un hachage ne fonctionne que pour les objets ActiveRecord et uniquement pour les attributs qui sont des colonnes. – cesoid

Répondre

23

Vous pouvez essayer d'utiliser l'instance du modèle ActiveRecord comme un hachage.

u = User.find(1) 
name = u[:name] 
field = "first_name" 
first_name = u[field] 
+0

C'est la façon de le faire. – Mario

+0

+1 C'est l'approche conventionnelle lorsque le nom de l'attribut n'est pas connu à l'avance. – MDaubs

+1

Notez que cela ne fonctionne que pour les attributs qui sont des colonnes. Cela ne fonctionne pas pour les attributs rendus accessibles par attr_accessor. – cesoid

1

Je ne sais pas si je comprends tout à fait vos questions. Essayez quelque chose comme:

User.find(1).name 

si vous vous entendez ne voulez extraire de DB attribut spécifique que vous pouvez faire:

User.find(1,:select => :name) 
0

Essayez cette

u = User.find(1) 
attr = "first_name" 
u.send(attr) 
5

Essayez cette

user = User.find(1) 

alors quelque chose comme ça devrait faire Vous avez besoin de

user.send('field_name') 
+0

Lorsque vous travaillez avec des attributs enum, c'est la seule façon que j'ai trouvée qui renvoie le champ sous forme de chaîne plutôt que sa valeur entière brute. – justis

12

Encore une autre approche:

attr = :first_name 
@user.read_attribute attr 
+1

Je pense que cela devrait être la bonne réponse. – Starkers

Questions connexes