define_method with dynamic attributes

How would I take the dynamic nature of define_method and also use that to set attributes:

define_method ("#{ex}_method") do   self.my_db_attribute_ex = value end

Is there a way to set the attribute part dynamically?

How would I take the dynamic nature of define_method and also use that

to set attributes:

define_method (“#{ex}_method”) do

self.my_db_attribute_ex = value

end

Is there a way to set the attribute part dynamically?

Me, you would do something like the following:

define_method( “#{ex}_method” ) do |value|

self.my_db_attribute_ex = value

end

Good luck,

-Conrad

Not looking at the value part looking at the attribute part. Is ex going to be dynamic to set the attribute name correctly?

Not looking at the value part looking at the attribute part. Is ex going to be dynamic to set the attribute name correctly?

Take a look at the send method (or in the special case of active record you could use update_attributes (or write_attribute and = if you want to operate a level lower))

Fred

Ok, I was also looking at testing for nil? and stuff as well not only setting the attr.

Is there not a way to form a string convert it to an attribute and then do Model.(string converted to attribute)?

Not looking at the value part looking at the attribute part. Is ex going to be dynamic to set the attribute name correctly?

Chris, you can dynamically set attributes by doing the following:

class Dynamic

define_method( “some_method=” ) do |value|

instance_variable_set( “@some_attribute” , some_value )

end

end

In Ruby, you can create an attribute by simply doing the following within an

instance method:

@some_attribute = some_value

For example, one can do the following:

class Dynamic

attr_accessor :foo

end

variable = Dynamic.new

variable.foo = 25

puts variable.foo

Good luck,

-Conrad

Is there not a way to form a string convert it to an attribute and then do Model.(string converted to attribute)?

Chris, you can do the following:

class Dynamic

name = foo

ivar = “@#{name}” # form the string

define_method( “#{name}=” ) do |value|

instance_variable_set( ivar, value ) # create an attribute

end

end

Also, you can do the above without using closures by doing

the following:

class Dynamic

name = “foo”

class_eval %{

def #{name}

@#{name}

end

def #{name}=(val)

@#{name} = val

end

}

end

However, it really depends what you’re trying to do because it’s not clear from the question.

Good luck,

-Conrad

I am trying to form a string from values that get passed to the define_method then take the string and use it either set data in a db or do a .nil? on it just like any other attribute from the db.

Ok, slightly different question. What is the best way to in a model to dynamically create a method:

you use define_method to create a method but how would I do it so I can do something like: m = model.new m.update_my_attrs(true)

m.update_me_attrs(false)

I have 2 methods that are almost the same except for the naming conventions between the two which update db values which have part of the method name in the attribute… Which seems like a good place for define_method.

Not with Active Record attributes - they're not instance variables.

Fred

I am trying to form a string from values that get passed to the define_method then take the string and use it either set data in a db or do a .nil? on it just like any other attribute from the db.

Like I said, you can use send for this (which allows you to call any method on a object) and update_attributes allows you set any attributes you want given their name and a new value

Fred