Looking up accessor methods for ActiveRecord objects

Hi,

I am trying to invoke a method on an ActiveRecord object using something
like:

k = :date=
obj.method(k).call(new_date)

Initially obj.method(k) is throwing a NameError. However, if I first
explicitly invoke any accessor method, then the above works as
expected:

obj.date # just get the date
k = :date=
obj.method(k).call(new_date) # works now

Is there a good way to ensure that these accessor methods are loaded
before
I try looking them up with .method()?

Thanks,
Erik

Is there a good way to ensure that these accessor methods are loaded
before
I try looking them up with .method()?

obj.public_methods.include(‘k’)

? (Also I can’t remember if k must be a symbol - :k)

BTW I doubt your premise, because I thought all attribute accessors get
generated at .find time…

Hi –

On Sun, 20 Jul 2008, Erik R. wrote:

explicitly invoke any accessor method, then the above works as
expected:

obj.date # just get the date
k = :date=
obj.method(k).call(new_date) # works now

Interestingly, that will happen when you call any unknown method on
the object:

t
=> #<Team id: 277401923, name: “Persuaders”, mascot: “Cat”, … >
t.methods.grep(/mascot/)
=> []
t.blah
NoMethodError: undefined method `blah’ for #Team:0x242e2d8
t.methods.grep(/mascot/)
=> [“mascot”, “mascot=”, “mascot?”]

method_missing creates the column attributes immediately if they don’t
exist, no matter what. The same thing happens with respond_to?

Is there a good way to ensure that these accessor methods are loaded
before
I try looking them up with .method()?

You could call define_attribute_methods on the class. That’s basically
what method_missing does.

David


Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails July 21-24 Edison, NJ
Advancing With Rails August 18-21 Edison, NJ
See http://www.rubypal.com for details and updates!

Hi –

On Sat, 19 Jul 2008, Phlip wrote:

Is there a good way to ensure that these accessor methods are loaded
before
I try looking them up with .method()?

obj.public_methods.include(‘k’)

The column attributes aren’t there initially. (Try it; you’ll see.)

? (Also I can’t remember if k must be a symbol - :k)

BTW I doubt your premise, because I thought all attribute accessors get
generated at .find time…

No, find doesn’t define the column attribute methods.

David


Rails training from David A. Black and Ruby Power and Light:
Intro to Ruby on Rails July 21-24 Edison, NJ
Advancing With Rails August 18-21 Edison, NJ
See http://www.rubypal.com for details and updates!