2017-12-27 35 views
0

레일/몽고드를 사용하여 모델에 동적 클래스를 만듭니다. 레코드에 액세스 할 때마다 특정 연관 레코드 (belongs_to, has_one)를 자동으로 포함하고자합니다. 따라서 이러한 모든 연관을 as_json 함수에 포함시켜야합니다.관계의 관계 일반화

'associations'메서드는 모든 관련 모델을 제공합니다. 그러나 포함하려는 연관 유형 만 필터링해야합니다. has_many 연관을 포함하면 엄청난 시간이 소요되는 데이터베이스 요청이 발생하고 데이터). 어떻게해야만 관련 연결 만 가져 오기 위해 연결 메서드의 출력을 필터링 할 수 있습니까?

내가 모든 협회를 통해 루프를 시도 :

협회 : 기관 {:

def as_json(options={}) 
    selected_associations=[] 
    associations.each do |ass| 
     puts "Association:: ", ass, ass=>relation 
     if association=='Belongs_To'  # Need the right instruction here 
     selected_associations.push(ass) 
     end 
    end 
    attrs = super(:include => selected_associations) 

    end 

두고 콘솔에 출력 다음 각 협회 나에게 전달한다 (엔티티가 하나 개의 모델)의 관계 = > Mongoid :: 관계 :: 참조 : :: nil, : inverse_class_name => "WSAEntity", : name => "entities", : class_name => "WSAEntity", : validate => true}

': relation => ...'을 어떻게 평가할 수 있습니까? 속성이 필요하므로 위의 코드를 수정하고 필요한 연관 유형을 선택하는 데 사용할 수 있습니까? 아니면 모든 필터링 된 연관성을 가진 배열을 얻는 더 좋은 방법이 있습니까?

감사합니다, 마이클

답변

1

이 시도 :

associations.each do |key, value| 
    ... 
    if value.macro == :belongs_to  # OR you can do `value.relation == Mongoid::Relations::Referenced::In` 
    selected_associations.push(key) # OR `value`, you need to decide what you need here 
    end 
end 

key 여기 예를 들어, 협회의 이름입니다 "사용자".

value은 다음과 같이 보입니다 : 위대한

#<Mongoid::Relations::Metadata 
autobuild: false 
class_name: User 
cyclic:  nil 
counter_cache:false 
dependent: nil 
inverse_of: nil 
key:   user_id 
macro:  belongs_to 
name:   user 
order:  nil 
polymorphic: false 
relation:  Mongoid::Relations::Referenced::In 
setter:  user= 
versioned: false> 
+0

을! 이것은 예상대로 작동합니다! 고마워, 마이클 –