2011-05-10 1 views
4

그래서 내 모든 아칸소를 통해 iterating하고 자신의 관계를 동적으로 설정 ... 그래서 SomeObject 가지고 그것이 ManyObjects belongs_to ... 나는 이런 식으로 뭔가를하고 싶어 :레일스 : ActiveRecord 및 보내기; 클래스 이름을 알고있는만큼 activerecord 인스턴스의 관계를 설정하려면 어떻게해야합니까?

an_object.some_relation = related_object 
an_object.save 

거기 있나요? 를 통해 이것을 수행하는 방법은 또는 이와 유사한 방법을 보냅니 까? 이것은 물론 작동하지 않습니다 :

an_object.send(some_relation_name, related_object) 

이 작품, 난 덜 위험하고 더 많은 레일 - 메타 방식으로하고 관심이 있어요 :

an_object.update_attributes({"#{some_relation_name}_id"=>related_object.id}) 

답변

14

그럼 당신이

을 할 수있는 :

이 작동
an_object.send(some_relation_name, related_object) 

, 내가 덜 위험, 레일 - 메타 더 방법을 그 일을 단지 관심

an_object.send("#{some_relation_name}=", related_object) 

이것은 setter 메서드를 동적으로 호출하는 것입니다.

또는 당신은 약간 낮은 수준 및 사용에 갈 수 :

an_object.reflect_on_association(some_relation_name).build_association(related_object_attributes) 

내가 가끔 보내 사용하기 작은 "무서운"의 첫 번째로 가고 싶어하지만 루비는 모든 것입니다, 동적 프로그램 작성.

+1

퍼펙트 ... 저는 그 심볼이 세터의 문자 그대로의 이름의 일부가 될 수 있다는 것을 항상 이해하지 못했습니다. – Zando

+0

'''reflect_on_association'''은 클래스 메소드입니다. – guapolo

관련 문제