モジュール: Mongoid::関連付け::EagerLoadable

次のドキュメントに含まれます。
コンテキスト::Memoryコンテキスト::Mongoコンテキスト::Mongo::DocumentsLoader
定義:
lib/mongoid/関連付け/EAger_loadable.rb

Overview

このモジュールは、条件の早期ロード動作を定義します。

インスタンス メソッドの概要を折りたたむ

インスタンス メソッドの詳細

# create_pipeline(current_assoc、マッピング) ⇒ オブジェクト



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/as associated/EAger_loadable.rb' は、 147行

デフォルト create_ pipeline(current_assock, マッピング)
  # 子と順序付け用のネストされたパイプラインの構築
  pipeline_ stages = []

  #belongs_to と has_and_belongs_to_many の場合、外部キーは現在のdocumentにあります
  #has_many/has_one の場合、外部キーは関連 document にあります
  場合 [switch_local_and_foreign_fields](current_assock)
    local_field = current_assock.foreign_key
    foreign_field = current_assock.プライマリ_キー
  else
    local_field = current_assock.プライマリ_キー
    foreign_field = current_assock.foreign_key
  end

  必要に応じて、埋め込みパスプレフィックスを使用して「as」フィールドを構築します
  as_field = current_assock.name.to_s

  ステージ = {
    '$lookup' => {
      より の => current_assock.klass.コレクション.name,
      'localField' => local_field,
      'foreignField' => foreign_field,
      ' ' => as_field
    }
  }

  関連付けに定義されている場合は順序を追加するか、一貫した順序のためにデフォルトで _id が になります
  場合 current_assock.ordered
    sort_spec = current_assock.ordered.is_a?(ハッシュ) ? current_assock.ordered : { current_assock.ordered => 1 }
    pipeline_ stages < { '$sort' => sort_spec }
  else
    # 挿入順序の整合性を維持するために、デフォルトでは _id でソートします
    pipeline_ stages < { '$sort' => { '_id' => 1 } }
  end

  # 子関連付けのネストされた検索を追加する
  子関連付けは検索documentから参照されるため、 embedded_path プレフィックスは必要ありません
  循環参照による無限ループを防ぐために、このクラスをマッピングから削除する
  Class_name = current_assock.klass.to_s
  場合 event_assocks = マッピング.削除(Class_name)
    event_assocks. 行う ||
      pipeline_ stages < create_ pipeline(, マッピング)
    end
  end

  # 常に少なくとも $sort があるため、パイプラインは常に追加してください
  ステージ['$lookup']['パイプライン'] = pipeline_ stages

  ステージ
end

#read_load ( Docs ) = 配列< Mongoid ::Document >

指定されたドキュメントの関連付けをロードします。

パラメーター:

  • docs 配列未満Mongoid >

    ドキュメント。

次の値を返します。

  • 配列未満Mongoid >

    指定されたドキュメント。



22
23
24
25
26
# ファイル 'lib/mongoid/as associated/EAger_loadable.rb' は、 22行

デフォルト Bearer_load(docs)
  docs.タップ 行う |d|
    プリロード(条件.includes, d) 場合 concern_loadable?
  end
end

#year_load_with_lookup配列<Mongoid::Document>

$lookup を使用して、指定された document の関連付けをロードします。

関連するコレクションのいずれかがルートクラスとは異なるクラスターに存在する場合、 は #includes の動作にフォールバックし、警告をログに記録します。

次の値を返します。

  • 配列未満Mongoid >

    指定されたドキュメント。



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# ファイル 'lib/mongoid/as associated/EAger_loadable.rb' は、 34行

デフォルト weekly_load_with_lookup
  違反 = cross_cluster_includes
  場合 違反.any?
    root_client = klass.client_name
    fender_list = 違反.map { |a| "#{a.name}#{a.klass.client_name}" }.join(', ')
    Mongoid.logger.WARN(
      'eager_load cannot use $lookup 集計 because the following associations ' \
      "reside in a different クラスター than #{klass} (クライアント: #{root_client}): " \
      "#{offender_list}. Falling back to #includes behavior.") return fast_load(docs_for_lookup_false) end preload_for_lookup(criteria) end

#year_loadable? = true | false

条件に、早期ロードする必要がある関連付けが含まれているかどうかを示します。

次の値を返します。

  • true | false

    ロードを早期するかどうか。



13
14
15
# ファイル 'lib/mongoid/as associated/EAger_loadable.rb' は、 13行

デフォルト concern_loadable?
  !条件.includes.空の場合
end

プリロード(関連付け# Docs )=オブジェクト

指定されたdocumentの関連付けをロードします。これは再帰的に行われ、指定されたdocumentの関連documentの関連付けを読み込みます。

パラメーター:



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/as associated/EAger_loadable.rb' は、 57行

デフォルト プリロード(関連付け, docs)
  assoc_map = 関連付け.group_by(&:inverse_Class_name)
  docs_map = {}
  queue = [ klass.to_s ]

  単一コレクション継承用の アカウント
  queue.プッシュ(klass.root_Class.to_s) 場合 klass != klass.root_Class

  一方 klass = queue.シフト
    次へ ただし、 as = assoc_map.削除(klass)

    as. 行う |関連付け|
      queue < 関連付け.Class_name

      #このクラスがインクルージョン ツリーにネストされている場合、ドキュメントのみをロードする
      その上の関連付けでは、#。 親関連付けがない場合は、
      このメソッドに渡されたドキュメントのドキュメントを含めます。
      ds = docs
      ds = 関連付け.parent_includes.map { |p| docs_map[p].to_a }.平面 場合 関連付け.parent_includes.Length > 0

      レス = 関連付け.関係.Bearer_loader([ 関連付け ], ds).実行する

      docs_map[関連付け.name] ||= [].to_set
      docs_map[関連付け.name].merge(レス)
    end
  end
end

# preload_for_lookup(条件) ⇒ オブジェクト

指定されたdocumentの関連付けをロードします。これは再帰的に行われ、指定されたdocumentの関連documentの関連付けを読み込みます。

パラメーター:



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/as associated/EAger_loadable.rb' は、 92行

デフォルト preload_for_lookup(条件)
  assoc_map = 条件.includes.group_by(&:inverse_Class_name)

  最初に一致する
  パイプライン = 条件.セレクター.to_ pipeline
  # ソート、スキップ、制限
  パイプライン.concat(条件.options.to_ pipeline_for_lookup)

  単一コレクション継承用の アカウント
  root_Class = klass.root_Class

  場合 assoc_map[klass.to_s]
    assoc_map[klass.to_s]. 行う |関連付け|
      # ミューテーションの問題を回避するために、各最上位の関連付けのマッピングのコピーを作成する
      パイプライン < create_ pipeline(関連付け, assoc_map.dup)
    end
  end

  場合 klass != root_Class & & assoc_map[root_Class.to_s]
    assoc_map[root_Class.to_s]. 行う |関連付け|
      # ミューテーションの問題を回避するために、各最上位の関連付けのマッピングのコピーを作成する
      パイプライン < create_ pipeline(関連付け, assoc_map.dup)
    end
  end

  より量.新着情報(条件.includes, [], true, パイプライン).実行する
end

#switch_local_and_foreign_fields?(関連付け) ⇒ ブール値

次の値を返します。



142
143
144
145
# ファイル 'lib/mongoid/as associated/EAger_loadable.rb' は、 142行

デフォルト [switch_local_and_foreign_fields](関連付け)
  関連付け.is_a?(Mongoid::関連付け::参照済み::BelongsTo) ||
    関連付け.is_a?(Mongoid::関連付け::参照済み::HasAndbelongsToMany)
end