2011-09-24 65 views
12

我想要一个Dashboard来显示多个模型的摘要,并且我使用Presenter实现了它,但没有自己的数据。我使用一个类加载ActiveModel(无数据表):如何将参数传递给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 

通过委托,我希望能够调用Dashboard.address并取回Account.find_by_user_id(Dashboard.user_id).address

如果仪表板是一个ActiveRecord类,那么我可以宣布Dashboard#belongs_to :account和代表将工作自动(即客户会知道它应该从帐户返回地址属性与user_id在Dashboard例如等于to user_id)。

但仪表板不是ActiveRecord类,所以我不能声明belongs_to。我需要另一种方式告诉帐户查找正确的记录。

有没有办法解决这个问题? (我知道我可以假装仪表板有一个空表,或者我可以将用户的实例方法重写为需要参数的类方法,但这些解决方案都是黑客)。

谢谢。

+0

这没有多大意义。什么是'id'?这应该是一个数字吗? (你不能'发送(“123”)',这不是一个有效的方法名称。)你不能使用'Dashboard.user_id'和'attr_accessor:user_id',一个是类,另一个是实例。 ..请澄清并举例说明你如何期望这项工作。 –

+0

嗨安迪,可能我不够清楚。请注意,这不是一个常规的ActiveRecord :: Base类。因此,我需要一个属性来保存current_user的id。 (我不想永久保留这个ID)。通过委托,我希望能够调用Dashboard.address并获取Account.find_by_user_id(Dashboard.user_id).address。我试图将此函数委托给Account类,但我需要以某种方式将user_id值传递给Account,以便它知道应该使用哪个帐户实例。 – AdamNYC

回答

10

当你写delegate :address, :to => :account,这造成仪表盘上的一个新address方法基本上调用同一个对象的account方法,然后在此account方法的结果调用address。这是(非常粗略地)类似于写作:

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

根据您当前的类,所有你所要做的就是创建一个account方法,用正确的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 

这将允许你访问这样的地址:

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

谢谢Benoit。这正是我正在寻找的。 – AdamNYC

+0

@AdamNYC如果您对上述代码有任何疑问,请不要犹豫,以澄清问题,我会很乐意提供更多解释。 –