모듈: Mongoid::Association::EagerLoadable

포함 항목:
Contextual::Memory, Contextual::Mongo, Contextual::Mongo::DocumentsLoader
다음에 정의됨:
lib/mongoid/association/eager_loadable.rb

개요

이 모듈은 기준에 대한 선행 로딩 동작을 정의합니다.

인스턴스 메서드 요약 접기

인스턴스 메서드 세부 정보

#create_pipeline(current_assoc, mapping) ⇒ 객체



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 147

def create_pipeline(current_assoc, 매핑)
  # 하위 및 순서 지정을 위한 중첩 파이프라인 구축
  파이프라인_단계 = []

  # exists_to 및 has_and_belongs_to_many의 경우, 외래 키는 현재 문서 에 있습니다.
  # has_many/has_one의 경우 외래 키는 관련 문서 에 있습니다.
  만약 switch_local_and_foreign_fields?(current_assoc)
    local_field = current_assoc.foreign_key
    foreign_field = current_assoc.Primary_key
  other
    local_field = current_assoc.Primary_key
    foreign_field = current_assoc.foreign_key
  end

  # 필요한 경우 포함된 경로 접두사로 'as' 필드 빌드합니다.
  as_field = current_assoc.이름.to_s

  단계 = {
    ' $lookup ' => {
      '에서 ' => current_assoc.class.컬렉션.이름,
      'localField ' => local_field,
      'foreignField ' => foreign_field,
      '로 ' => as_field
    }
  }

  # 연관 관계에 정의된 경우 순서를 추가하거나 일관적인 순서를 위해 기본값 _id 로 설정합니다.
  만약 current_assoc.주문
    sort_spec = current_assoc.주문.is_a?(해시) ? current_assoc.주문 : { current_assoc.주문 => 1 }
    파이프라인_단계 << { '$sort' => sort_spec }
  other
    # 기본적으로 삽입 순서 일관성 유지하기 위해 _id 를 기준으로 정렬합니다.
    파이프라인_단계 << { '$sort' => { '_id' => 1 } }
  end

  # 하위 연관 관계에 대한 중첩 조회 추가
  # 하위 연관 관계는 조회된 문서 에서 참조되므로 embedded_path 접두사가 필요하지 않습니다.
  # 순환 참조가 있는 무한 루프를 방지하려면 매핑에서 이 클래스를 제거합니다.
  class_name = current_assoc.class.to_s
  만약 Child_assocs = 매핑.삭제(class_name)
    Child_assocs. do |자식|
      파이프라인_단계 << create_pipeline(자식, 매핑)
    end
  end

  # 항상 최소 $sort가 있으므로 항상 파이프라인 추가합니다.
  단계[' $lookup ']['파이프라인 '] = 파이프라인_단계

  단계
end

#Huge_load(Docs) ⇒ Array<Mongoid::Document>

지정된 문서에 대한 연관 관계를 로드합니다.

매개변수:

반환합니다:



22
23
24
25
26
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 22

def Eager_load(참고자료)
  참고자료. do |d|
    사전 로드(기준.포함, d) 만약 Eager_loadable?
  end
end

#Huge_load_with_lookupArray

$lookup을 사용하여 지정된 문서에 대한 연관 관계를 로드합니다.

연결된 컬렉션이 루트 클래스와 다른 클러스터 에 있는 경우 #includes 동작으로 돌아가 경고를 기록합니다.

반환합니다:



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 34

def Eager_load_with_lookup
  범죄자 = Cross_cluster_inclusions
  만약 범죄자.어떤?
    root_client = class.client_name
    위반자 목록 = 범죄자.map { |a| "#{a. name} (#{a. klass. client_name})" }.가입(', ')
    몽고이드.로거.경고(
      'explain_load는 $lookup 집계 사용할 수 없는데, 이는  '{klass}  ( 클라이언트 : #{root_client}):  ' '#{범법자 목록} 연관 관계' \ "가 다른 클러스터 에  있기 때문입니다. #includes 동작. " )
    return concern_load(docs_for_lookup_fallback)
  종료

  preload_for_lookup(기준)
종료

#Huge_loadable?true | false

기준에 즉시 로드해야 하는 연관 포함이 있는지 여부를 나타냅니다.

반환합니다:

  • (true | false)

    선행 로드 여부입니다.



13
14
15
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 13

def Eager_loadable?
  !기준.포함.비어 있나요?
end

#사전 로드(associations, Docs) ⇒ 객체

지정된 문서에 대한 연관 관계를 로드합니다. 이 작업은 재귀적으로 수행되어 지정된 문서의 관련 문서와의 연관 관계를 로드합니다.

매개변수:



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 57

def 사전 로드(연관 관계, 참고자료)
  assoc_map = 연관 관계.group_by(&:inverse_class_name)
  docs_map = {}
  대기열 = [ class.to_s ]

  # 단일 컬렉션 상속을 위한 계정
  대기열.push(class.root_class.to_s) 만약 class != class.root_class

  동안 class = 대기열.shift
    다음 하지 않는 한 방식 = assoc_map.삭제(class)

    방식. do |assoc|
      대기열 << assoc.class_name

      # 이 클래스가 포함 트리에 중첩된 경우 문서만 로드합니다.
      # 위의 연관 관계에 대해. 상위 연관 관계가 없는 경우,
      # 이 메서드에 전달된 문서의 문서를 포함합니다.
      ds = 참고자료
      ds = assoc.parent_inclusions.map { |p| docs_map[p].to_a }.flatten 만약 assoc.parent_inclusions.분량 > 0

      res = assoc.관계.Eager_loader([ assoc ], ds).실행

      docs_map[assoc.이름] ||= [].to_set
      docs_map[assoc.이름].merge(res)
    end
  end
end

#preload_for_lookup(기준)객체

지정된 문서에 대한 연관 관계를 로드합니다. 이 작업은 재귀적으로 수행되어 지정된 문서의 관련 문서와의 연관 관계를 로드합니다.

매개변수:



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 92

def preload_for_lookup(기준)
  assoc_map = 기준.포함.group_by(&:inverse_class_name)

  # 먼저 일치
  파이프라인 = 기준.선택기.to_pipeline
  # 그런 다음 정렬, 건너뛰기, 제한
  파이프라인.concat(기준.옵션.to_pipeline_for_lookup)

  # 단일 컬렉션 상속을 위한 계정
  root_class = class.root_class

  만약 assoc_map[class.to_s]
    assoc_map[class.to_s]. do |assoc|
      # 변형 문제를 방지하기 위해 각 최상위 연관 관계에 대한 매핑 사본을 생성합니다.
      파이프라인 << create_pipeline(assoc, assoc_map.dup)
    end
  end

  만약 class != root_class && assoc_map[root_class.to_s]
    assoc_map[root_class.to_s]. do |assoc|
      # 변형 문제를 방지하기 위해 각 최상위 연관 관계에 대한 매핑 사본을 생성합니다.
      파이프라인 << create_pipeline(assoc, assoc_map.dup)
    end
  end

  열망.신규(기준.포함, [], true, 파이프라인).실행
end

#switch_local_and_foreign_fields?(association) ⇒ 부울

반환합니다:



142
143
144
145
# 파일 'lib/mongoid/association/eager_loadable.rb', 줄 142

def switch_local_and_foreign_fields?(연관 관계)
  연관 관계.is_a?(몽고이드::연관 관계::참조됨::Belongs To) ||
    연관 관계.is_a?(몽고이드::연관 관계::참조됨::Has And Belongs To Many)
end