2010-10-12 9 views
12

tengo un modelo PaymentDetail con el atributo 'home_address_country', para que pueda utilizar¿Cómo usar una variable como atributo de objeto en rieles?

@payment_detail.home_address_country //where @payment_detail is object of that model. 

quiero usar algo como esto: ---

country_attribute=address_type+"_address_country" //where address type is equal to 'home' 
@payment_detail."#{country_attribute}" 

Medios nombre de atributo se almacena en una variable. ¿Cómo puedo hacer esto?

EDITAR

country_attribute=address_type+"_address_country" 
country_list=Carmen::country_names 
eval("@#{country_attribute} = #{country_list}") 

Respuesta

34
  • Reading atributo AR

    @payment_detail.send("#{address_type}_address_country") 
    

    O

    @payment_detail.read_attribute("#{address_type}_address_country") 
    
  • Writing atributo AR

    @payment_detail.send("#{address_type}_address_country=", value) 
    

    O

    @payment_detail.write_attribute("#{address_type}_address_country", value) 
    
  • Setting instancia de variable

    @payment_detail.instance_variable_set("@#{address_type}_address_country", value) 
    
  • Getting instancia de variable

    @payment_detail.instance_variable_get("@#{address_type}_address_country") 
    

Referencia

4

manera recomendada para Rails 3 es utilizar dictionary-like access:

attr = @payment_detail["#{address_type}_address_country"] 
attr = "new value" 
@payment_detail["#{address_type}_address_country"] = attr 

read_attribute y write_attribute métodos funcionan solo para Rails 2.

+0

FYI, estoy probando esto en Rails 4 y #read_attribute todavía está en funcionamiento, no estoy seguro acerca de #write_attribute. Sin embargo, estoy cambiando para usar #send. – Dylan

Cuestiones relacionadas