AssociationProxy class decoupling suggestion

Hi guys!

I'm writing a small bridge app now, and I have following class:

class Board
  belongs_to :user_n, ...
  belongs_to :user_e, ...
  belongs_to :user_s, ...
  belongs_to :user_w, ...

  def users
    [user_n, user_e, user_s, user_w]
  end
end

What I'm trying to do is to return something similar to
AssociationProxy in the method users. I see no point of creating many-
to-many association here - the only thing that I want to achieve is:

board.users.owner(card) # returns user that owns given card

I've spent some time on analysing AssociationProxy class, and I think
it's possible to decouple general Proxy class from it. It'd be really
nice to implement the "users" method like:

def users
  ActiveSupport::Proxy.new([user_n, user_e, user_s, user_w]) do
    def owner(card)
      ...
    end
  end
end

I can try to write something, but I'd like to know if it's worth
spending few hours on it. What do you think about it?

Cheers,
Kuba.

Note that arrays have a metaclass, just like everything else:

def users
   result = [user_n, user_e, user_s, user_w]
   def result.owner(card)
     # define something; 'self' will be the array
   end
   result
end

But I'm not really sure why writing @board.users.owner(card) is in any way preferable to just defining 'owner' on Board - @board.owner(card)...

--Matt Jones

That's what I did: http://codaset.com/qoobaa/libre/source/master/blob/app/models/board.rb

But I need to access the parent (Board) class from the extension
method. Probably I could use the JS version: to define that = self
before the definition. Anyway - it'd be really great to have Proxy
class in ActiveSupport I think.

Thanks,
Kuba.

Hi

I was also looking for similar 'proxy' mechanism. What I came up with
was:

module Proxy
  def Proxy.included(base)
    @@b = base
  end
  def proxy(o, &class_body)
    def o.parent() @@b end
    o.extend(Module.new(&class_body))
  end
end

class Foo
  include Proxy

  def initialize
    @user = ['john', 'doe']
  end

  def user_proxy
    proxy(@user) do
      def hi
        "Hello #{self.join(' ')} from class #{parent}"
      end
    end
  end

end

puts Foo.new.user_proxy.hi # => Hello john doe from class Foo

However, it would make more sense to use logic from AssociationProxy,
if it's already there.

I don’t think this is a good place to discuss about this. Try here: http://groups.google.com/group/rubyonrails-talk