7

如果我有一个作为字符串的关联名称,有没有办法可以获取关联对象的句柄?

例如:

o = Order.first

o.customer 会给我这个订单所属的客户对象。

如果我有:

o = Order.first
relationship = 'customer'

我想做类似的事情:

customer = eval("o.#{relationship}")

我知道 eval 是一个糟糕的选择,我应该避免它。执行此操作的最佳方法是什么(因为 eval 在此示例中不起作用)。

我确实有这个工作:

customer = o.association(relationship)

后来我发现该关联不是公共 API 的一部分,不应该使用。因为当我使用一行代码时,我在页面的上方(引用了该关系)停止了工作。

任何想法都会很棒!

4

3 回答 3

19

只是这样做呢?

customer = o.send(relationship)
于 2013-07-02T18:08:03.763 回答
3

如果关系不存在,您可以使用try()which 将允许您管理任何错误。undefined method

relationship = 'customer'
foo = 'foo'

customer = o.try(relationship)
# > [
#     [0] #<Customer...

customer = o.try(foo)
# > nil

send()

customer = o.send(relationship)
# > [
#     [0] #<Customer... 

customer = o.send(foo)
# > NoMethodError: undefined method `foo' for #<Order...
于 2015-09-26T00:55:18.760 回答
3

对于那些害怕使用的人send

o.association(relationship).scope
于 2019-05-02T07:59:19.477 回答