如何将参数传递给Rails中的委托方法
我想要一个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
。我需要另一种方式告诉帐户查找正确的记录。
有没有办法解决这个问题? (我知道我可以假装仪表板有一个空表,或者我可以将用户的实例方法重写为需要参数的类方法,但这些解决方案都是黑客)。
谢谢。
当你写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
谢谢Benoit。这正是我正在寻找的。 – AdamNYC
@AdamNYC如果您对上述代码有任何疑问,请不要犹豫,以澄清问题,我会很乐意提供更多解释。 –
这没有多大意义。什么是'id'?这应该是一个数字吗? (你不能'发送(“123”)',这不是一个有效的方法名称。)你不能使用'Dashboard.user_id'和'attr_accessor:user_id',一个是类,另一个是实例。 ..请澄清并举例说明你如何期望这项工作。 –
嗨安迪,可能我不够清楚。请注意,这不是一个常规的ActiveRecord :: Base类。因此,我需要一个属性来保存current_user的id。 (我不想永久保留这个ID)。通过委托,我希望能够调用Dashboard.address并获取Account.find_by_user_id(Dashboard.user_id).address。我试图将此函数委托给Account类,但我需要以某种方式将user_id值传递给Account,以便它知道应该使用哪个帐户实例。 – AdamNYC