【问题标题】:dynamically get rails association动态获取rails关联
【发布时间】:2013-07-02 18:04:07
【问题描述】:

如果我有一个字符串形式的关联名称,有没有办法获得关联对象的句柄?

例如:

o = Order.first

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

如果我有:

o = Order.first
relationship = 'customer'

我想做类似的事情:

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

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

我确实有这个工作:

customer = o.association(relationship)

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

任何想法都会很棒!

【问题讨论】:

    标签: ruby-on-rails associations active-relation


    【解决方案1】:

    这样做怎么样?

    customer = o.send(relationship)
    

    【讨论】:

    • 不需要调用#to_sym; send 可以处理字符串。
    • 哇,就像魔术一样!是发送 rails 还是 ruby​​ 方法?我找不到关于它的文档。顺便说一句,我从未使用过它,所以我不知道它是如何工作的。再次感谢!
    • Send 是一种 ruby​​ 方法。它也可以带参数。你可以在这里找到关于#send 的文档:ruby-doc.org/core-2.0/Object.html#method-i-send
    • 你的回答太快了,我还不接受,我会在几分钟内,谢谢!
    【解决方案2】:

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

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

    vssend()

    customer = o.send(relationship)
    # > [
    #     [0] #<Customer... 
    
    customer = o.send(foo)
    # > NoMethodError: undefined method `foo' for #<Order...
    

    【讨论】:

      【解决方案3】:

      对于那些害怕使用send的人:

      o.association(relationship).scope
      

      【讨论】:

        猜你喜欢
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多