14

I have a PaymentDetail model with attribute 'home_address_country', so i can use

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

I want to use something like this:---

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

Means attribute name is stored in a variable. How can i do this?

EDIT

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

2 Answers 2

43
  • Reading AR attribute

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

    OR

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

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

    OR

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

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

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

Reference

Sign up to request clarification or add additional context in comments.

Comments

4

Recommended way for Rails 3 is to use dictionary-like access:

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

read_attribute and write_attribute methods work for Rails 2 only.

1 Comment

FYI, I'm testing this in Rails 4 and #read_attribute is still operational -- not sure about #write_attribute. I'm switching to use #send instead, though.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.