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?

On Sun, Apr 4, 2010 at 9:29 AM, Me [email protected] wrote:

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?

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

On Sun, Apr 4, 2010 at 12:57 PM, Frederick C. <

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

On Apr 4, 6:50 pm, Chris H. [email protected] wrote:

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

On Sun, Apr 4, 2010 at 10:50 AM, Chris H. [email protected]
wrote:

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

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.

On Sun, Apr 4, 2010 at 11:46 AM, Chris H. [email protected]
wrote:

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

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.

On Apr 4, 8:15 pm, Conrad T. [email protected] wrote:

define_method( “#{name}=” ) do |value|
instance_variable_set( ivar, value ) # create an attribute
end

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

Fred

On Apr 4, 8:38 pm, Chris H. [email protected] wrote:

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