15

我想要一个仪表板来显示多个模型的摘要,并且我使用 Presenter 实现了它,而没有它自己的数据。我使用一个 ActiveModel 类(没有数据表):

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

如果 Dashboard 是一个 ActiveRecord 类,那么我可以声明Dashboard#belongs_to :account并且委托会自动工作(即,Account 会知道它应该从具有user_id等于to user_idDashboard 实例的帐户返回地址属性)。

但是 Dashboard 不是 ActiveRecord 类,所以我不能声明belongs_to. 我需要另一种方法来告诉 Account 查找正确的记录。

有没有办法克服这个问题?(我知道我可以伪造 Dashboard 以获得一个空表,或者我可以将 User 的实例方法重写为带参数的类方法。但这些解决方案都是 hack)。

谢谢你。

4

1 回答 1

13

当您编写时delegate :address, :to => :account,这会在 Dashboard 上创建一个新address方法,该方法基本上调用account同一对象上的方法,然后调用addressaccount方法的结果。这(非常粗略)类似于写作:

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
于 2011-09-24T14:22:54.230 回答