2011-09-24 22 views
12

Me gustaría tener un Tablero para mostrar el resumen de varios modelos, y lo implementé usando Presenter sin sus propios datos. Yo uso una clase ActiveModel (sin tabla de datos):Cómo pasar un argumento para delegar el método en Rails

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

end 

Por delegado, quiero ser capaz de llamar a Dashboard.address y volver Account.find_by_user_id(Dashboard.user_id).address.

Si tablero de instrumentos era una clase ActiveRecord, entonces yo podría haber declarado Dashboard#belongs_to :account y delegado trabajaría de forma automática (es decir, cuenta sabría debe devolver atributo de dirección de la cuenta con user_id iguales to user_id en la instancia del tablero de instrumentos).

Pero Dashboard no es una clase ActiveRecord, por lo que no puedo declarar belongs_to. Necesito otra forma de decirle a la cuenta que busque el registro correcto.

¿Hay alguna manera de solucionar este problema? (Sé que puedo falsificar el Tablero para tener una tabla vacía, o puedo reescribir los métodos de instancia del Usuario para los métodos de clase que toman el argumento. Pero estas soluciones son todos pirateos).

Gracias.

+0

Esto no tiene mucho sentido. ¿Qué es 'id'? ¿Se supone que es un número? (No puede 'enviar (" 123 ")', ese no es un nombre de método válido.) No puede usar 'Dashboard.user_id' con' attr_accessor: user_id', una es una clase y la otra es la instancia. .. Por favor aclare y dé ejemplos de cómo espera que esto funcione. –

+0

Hola Andy, puede ser que no soy lo suficientemente claro. Tenga en cuenta que esta no es una clase ActiveRecord :: Base regular. Por lo tanto, necesito un atributo para mantener la identificación del usuario actual. (No quiero mantener esta identificación permanentemente) Por delegado, deseo poder llamar a Dashboard.address y obtener de nuevo Account.find_by_user_id (Dashboard.user_id) .address. Intenté delegar esta función en la clase de Cuenta, pero necesito pasar el valor de id_usuario a Cuenta de alguna manera, para que sepa con qué instancia de cuenta debería funcionar. – AdamNYC

Respuesta

10

Cuando se escribe delegate :address, :to => :account, esto crea un nuevo método address el tablero de instrumentos que pide básicamente el método account en el mismo objeto y luego llama address en el resultado de este método account. Esto es (muy aproximadamente) similar a la escritura:

class Dashboard 
... 
    def address 
    self.account.address 
    end 
... 
end 

Con su clase actual, todo lo que tiene que hacer es crear un método account que devuelve la cuenta con el correcto user_id:

class Dashboard 
    attr_accessor :user_id 
    def initialize(id) 
    self.user_id = id 
    end 

    delegate :username, :password, :to => :user 
    delegate :address, :to => :account 
    delegate :friends, :to => :friendship 

    def account 
    @account ||= Account.find_by_user_id(self.user_id) 
    end 
end 

Este le permitiría acceder a la dirección de esta manera:

dashboard = Dashboard.new(1) 
# the following returns Account.find_by_user_id(1).address 
address = dashboard.address 
+0

Gracias Benoit. Eso es exactamente lo que estoy buscando. – AdamNYC

+0

@AdamNYC No dude en pedir aclaraciones si tiene alguna duda sobre el código anterior, con mucho gusto le daré explicaciones adicionales. –

Cuestiones relacionadas