如何将参数传递给Rails中的委托方法
Posted
技术标签:
【中文标题】如何将参数传递给Rails中的委托方法【英文标题】:How to pass argument to delegate method in Rails 【发布时间】:2011-11-24 03:07:06 【问题描述】:我想要一个仪表板来显示多个模型的摘要,我使用 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
并且委托将自动工作(即,帐户会知道它应该从帐户返回地址属性,user_id
在 Dashboard 实例中等于 to user_id
)。
但是 Dashboard 不是 ActiveRecord 类,所以我不能声明 belongs_to
。我需要另一种方法来告诉 Account 查找正确的记录。
有没有办法解决这个问题? (我知道我可以伪造 Dashboard 以获得一个空表,或者我可以将 User 的实例方法重写为带参数的类方法。但这些解决方案都是 hack)。
谢谢。
【问题讨论】:
这没有多大意义。id
是什么?应该是数字吗? (你不能send("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,以便它知道应该使用哪个帐户实例。
【参考方案1】:
当您编写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
【讨论】:
谢谢伯努瓦。这正是我正在寻找的。span> @AdamNYC 如果您对上述代码有任何疑问,请随时要求澄清,我很乐意提供额外的解释。以上是关于如何将参数传递给Rails中的委托方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中使用环境将参数传递给 Rake 任务? [复制]
如何将参数传递给 Rails 4 中的 has_many 关联范围?
如何将参数传递给 Thread 中的 ThreadStart 方法?