モジュール: Mongoid::関連付け::EagerLoadable
- 次のドキュメントに含まれます。
- コンテキスト::Memory 、コンテキスト::Mongo 、コンテキスト::Mongo::DocumentsLoader
- 定義:
- lib/mongoid/関連付け/EAger_loadable.rb
Overview
このモジュールは、条件の早期ロード動作を定義します。
インスタンス メソッドの概要を折りたたむ
- #create_pipeline(current_assoc、マッピング) ⇒ オブジェクト
-
#ageage_load ( Docs) = <Mongoid::Document>配列[Mongoid::Document]
指定されたドキュメントの関連付けをロードします。
-
#year_load_with_lookup ⇒ 配列<Mongoid::Document>
$lookup を使用して、指定された document の関連付けをロードします。
-
#year_loadable? = true | false
条件に、早期ロードする必要がある関連付けが含まれているかどうかを示します。
-
プリロード(関連付け# Docs )=オブジェクト
指定されたドキュメントの関連付けをロードします。
-
#preload_for_lookup(条件) = オブジェクト
指定されたドキュメントの関連付けをロードします。
- [switch_local_and_foreign_fields] (関連付け) = ブール値
インスタンス メソッドの詳細
# 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 >
指定されたドキュメントの関連付けをロードします。
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 の動作にフォールバックし、警告をログに記録します。
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
条件に、早期ロードする必要がある関連付けが含まれているかどうかを示します。
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(条件..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 |