Overloading and wrapping an association method

Hi all:

For example I have:

class Color < ActiveRecord::Base    belongs_to :ball end

class Ball < ActiveRecord::Base   has_many :colors end

What I want to do is to write a method that: 1. takes the result of Ball#colors, which is an array of Color objects 2. do something with the array 3. return the result

but I want to name my method Ball#colors, i.e. I want to overload the generated association method: class Ball < ActiveRecord::Base   def colors      # do something here   end end

Is there anyway to do this?

Thanks,

Jesse

Hmmm... I'm thinking somewhere along the lines of using Object#method to store the original method as a class variable, but this seems very hacky to me. Is there any other way?

Best regards,

Jesse

Well, you could use the "alias" method: http://ruby.about.com/od/learnruby/qt/using_alias.htm

But really, what you originally wrote is perfectly fine. The has_many :colors just creates, among other things, a getter and setter method. Then, by (re)defining "colors" via your "def colors..." code, you are overriding that.

I did a quick test and it works just fine. You could still use alias so you keep a reference to the assocation. For example, wrap it up in a single class and do this:

class Ball < ActiveRecord::Base   has_many :colors   alias :old_colors :colors

  def colors     puts "in new colors def   end end

That works just fine.

-Danimal

Hi Danimal:

Your suggestion works perfectly! Thanks :slight_smile:

Best regards,

Jesse