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]

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[user_n, user_e, user_s, user_w]) do
    def owner(card)

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?


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

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:

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.



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

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

class Foo
  include Proxy

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

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


puts # => 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: