Ruby 如何在运行时检索rails 3.2.12中字符串变量中存储了关系的对象?

Ruby 如何在运行时检索rails 3.2.12中字符串变量中存储了关系的对象?,ruby,ruby-on-rails-3,Ruby,Ruby On Rails 3,假设有客户、账户和地址: class Customer has_many :accounts end class Account belongs_to :customer has_many :addresses end class Address belongs_to :account end 给定一个对象地址,可以检索其客户,如下所示: customer = address.account.customer 现在,让我们将关系存储在字符串变量address\u rel

假设有
客户
账户
地址

class Customer
  has_many :accounts
end

class Account 
  belongs_to :customer
  has_many :addresses
end

class Address
  belongs_to :account
end
给定一个对象地址,可以检索其客户,如下所示:

customer = address.account.customer
现在,让我们将关系存储在字符串变量
address\u relation='account.customer'
中。给定一个
地址
对象,是否有方法使用字符串变量
地址关系
检索其
客户
,如:

客户=地址。地址与关系


谢谢您的帮助。

我不确定我是否正确理解了这个问题,但我想您可以使用Ruby的方法来动态解决模型关系

object  = customer
methods = "account.customer".split(".")

methods.each do |m|
  object = object.send(m)
end

我不确定我是否正确理解了这个问题,但我想您可以使用Ruby的方法来动态解决模型关系

object  = customer
methods = "account.customer".split(".")

methods.each do |m|
  object = object.send(m)
end
我会做类似的事情

customer = address.address_relation.split(".").inject(address) do |object, method| 
  object.send(method)
end
如果您的关系链中可能有一个nil对象,您可以通过
尝试
切换
发送

我会这样做

customer = address.address_relation.split(".").inject(address) do |object, method| 
  object.send(method)
end

你可以通过
尝试
切换
发送
,如果你的关系链中可能有一个nil对象

是的,这实际上是一个比我更好的例子。我正在编辑代码片段以将其转换为递归函数,但使用inject/reduce实际上更加精确。@user938363
inject
位于标准ruby库中。假设你有一个a1,a2,a3。。。物体。对名为
f
的块使用
inject
相当于调用
f(f(f(base,a1),a2),a3)…
。对于集合的每个成员,将调用该块并将其作为参数1/上一次调用的返回值2/当前项itered
base
用于第一次调用,此时还没有以前的返回值。是的,这实际上是一个比我更好的示例。我正在编辑代码片段以将其转换为递归函数,但使用inject/reduce实际上更加精确。@user938363
inject
位于标准ruby库中。假设你有一个a1,a2,a3。。。物体。对名为
f
的块使用
inject
相当于调用
f(f(f(base,a1),a2),a3)…
。对于集合的每个成员,将调用该块并将其作为参数1/上一次调用的返回值2/当前项itered<当还没有以前的返回值时,code>base
用于第一次调用。