2011-05-13 17 views
9

¿Cómo puedo obtener el atributo del objeto modelo dinámicamente? Tengo el atributo del objeto de usuario como cadena:obtener el atributo del modelo dinámicamente en los rieles 3

u = User.find(1) 

¿Puedo hacer algo como u.get("user_id")

+0

No estoy totalmente la comprensión de esta cuestión. ¿Qué estás tratando de hacer exactamente? –

+0

Siéntase libre de aceptar una respuesta de alguna a continuación si está contento? ¿No está cerca de lo que necesita? –

+1

Si solo está hablando de objetos ActiveRecord (como en el ejemplo del código), probablemente debería ser más explícito al respecto en el título y la pregunta. (No me di cuenta de esto hasta que probé la respuesta.) La respuesta elegida que trata el modelo como un hash solo funciona para los objetos ActiveRecord y solo para los atributos que son columnas. – cesoid

Respuesta

23

Puede intentar usar la instancia del modelo de ActiveRecord como un hash.

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

Esta es la manera de hacerlo. – Mario

+0

+1 Este es el enfoque convencional cuando el nombre del atributo no se conoce de antemano. – MDaubs

+1

Tenga en cuenta que esto solo funciona para los atributos que son columnas. No funciona para los atributos accesibles a través de attr_accessor. – cesoid

1

No estoy seguro si estoy totalmente de entender sus preguntas. Pruebe algo como:

User.find(1).name 

si usted quiere decir que solamente se desea obtener de atributo específico DB que puede hacer:

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

probar este

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

probar este

user = User.find(1) 

entonces algo como esto debería hacer wh a usted requiere

user.send('field_name') 
+0

Al trabajar con atributos enum, esta es la única forma que he encontrado que devuelve el campo como una cadena en lugar de su valor entero sin formato. – justis

12

Sin embargo, otro enfoque:

attr = :first_name 
@user.read_attribute attr 
+1

Creo que esta debería ser la respuesta correcta. – Starkers

Cuestiones relacionadas