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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs