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()を管理できるようにするために使用できます。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 に答える