2013-07-02 4 views
4

연결 이름이 문자열 인 경우 연관 객체에 대한 핸들을 얻을 수있는 방법이 있습니까? 예를 들어동적으로 레일 연결 얻기

:

o = Order.first 

o.customer 나에게이 순서가 속한 고객 객체를 제공 할 것입니다.

내가있는 경우 :

o = Order.first 
relationship = 'customer' 

내가 좋아하는 일을하고 싶습니다 :

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

내가 평가 아는 끔찍한 옵션이며 나는 그것을 피해야한다. 이것을 수행하는 가장 좋은 방법은 무엇입니까 (이 예에서 eval은 작동하지 않습니다).

customer = o.association(relationship) 

나중에 협회가 공개 API의 일부가 아닌 사용해서는 안 것을 발견 :

나는이 작업을했다. 왜냐하면 내가 코드의 라인을 잡았을 때 나는 그 페이지를 위로 올려서 (그 관계를 참조했다) 작동을 멈췄다.

어떤 아이디어라도 좋을 것입니다!

답변

14

그냥이 작업을 수행하면 어떨까요?

customer = o.send(relationship) 
+3

#to_sym에 대한 호출이 필요하지 않습니다; send는 문자열을 처리 할 수 ​​있습니다. – Mori

+0

힌트를 보내 주셔서 감사 드리며 코드를 편집했습니다. – mario

+0

와우, 마술처럼! 레일이나 루비 방법을 보내고 있습니까? 내가 그것에 대한 문서를 찾을 수 없습니다. 덧붙여 말하자면, 나는 이것을 사용하지 못해서 이것이 어떻게 작동하는지 전혀 모른다. 다시 한 번 감사드립니다! – Sean

2

당신은 관계가 존재하지 않는 경우 당신이 어떤 undefined method 오류를 관리 할 수 ​​try()를 사용할 수 있습니다.

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...