2013-07-06 9 views
5

모델의 연관성이 "has_one"또는 "has_many"인 경우 (즉, 하나의 객체 또는 여러 객체에 대한 연관) 동적으로 결정하는 쉬운 방법이 있는지 궁금합니다.레일스는 연관성이 has_one인지 has_many인지를 결정합니다.

내가 MongoMapper을 사용하고

, 그래서 클래스 klass

klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::OneAssociation 
klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::ManyAssociation 

를 통해 하나 개 이상의 관계와 관련 모델 assoc을 가지고 있지만이 오히려 거추장스러운 것, 그리고 일반적인 아닌지 확인 할 수 있어요 (즉, ActiveRecord 연결에 대해서도 작동하지 않습니다). 어떤 객체를 로딩하는 것을 피하기를 원합니다. 그래서 instance.assoc.is_a? Array도 나왔습니다.

아이디어가 있으십니까?

+0

이 하나만 알아 냈습니까? 방금 액티브 레코드 (ActiveRecord)에 대해서도 똑같은 것을 발견했습니다. – MCB

답변

6

UPDATE : 그래서, 나는 반사 클래스 메소드 http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html

우연히 당신은 reflect_on_all_associations 방법으로 모든 has_many, belongs_to 등을 얻을 수 있습니다. 그것은 모두 거기에 있습니다. 또는 당신은 reflect_on_association로 협회에 넣을 수 있습니다 그것은 등을 구체적으로 has_many, has_one 인 경우는 당신을 말할 것이다 :

Model.reflect_on_association(:assoc).macro 

이 모든 경우에 충분합니다. 현재 실제로 작업하고있는 문제는 실제로 해결되지 않지만 해결해야합니다.

+0

완벽하지는 않지만 클래스 이름에 따라 작동 할 수 있습니다. 'UserAttributes'라는 또 다른 클래스의'has_one' 클래스'User'를 생각해보십시오. 불행하게도'respond_to? (assoc_name.singularize)'호출에 false를 리턴하는'user.user_attributes'를 통해 이것을 액세스 할 수 있습니다. 이 클래스의 이름을 UserAttributeSet이나 비슷한 이름으로 바꾸어야한다고 주장 할 수도 있습니다 (이 경우에는'singularize'가 작동 할 수도 있습니다).하지만 연관성 타입이 올바른지에 대한 보장은 없습니다. 인스턴스 이름은 단수 또는 복수입니다. – pariser

+0

글쎄, 복수화 된 모델명을 갖는 것은 Rails 명명 규칙 (http://itsignals.cascadia.com.au/?p=7)을 위반하게되므로 모델 UserAttributes가 없어야합니다. 항상 UserAttribute 여야합니다. 따라서 단수 또는 복수는 has_one 또는 has_many 관계를 반영해야합니다. 다른 모든 문제는 입력을 시작하는 논리가 무엇이든 처리해야합니다. – MCB

+0

실제로 당신 말이 맞습니다. 모든 경우를 다루지는 않는다는 것을 증명하는 더 좋은 방법이 있습니다 : 연관성 이름''물고기 ''가 무수한 모델'물고기'를 생각해보십시오. 이것은 "물고기"라는 단어가 명사의 단수형 또는 복수형 (예 :''물고기''.== "물고기".pluralize')이라는 것을 의미합니다. 따라서 이것은''has_one : 물고기'또는'has_many : 물고기'. – pariser