模块:Mongoid::Threaded
Overview
此模块包含可轻松访问在当前线程上具有生命周期的对象的逻辑。
在命名空间下定义
模块: 生命周期
常量摘要折叠
- STORAGE_KEY =
共享线程和纤程本地存储的键。它必须是一个符号,因为纤程本地存储的键必须是符号。
:'[mongoid]'- STORAGE_OWNER_KEY =
追踪哪个纤程拥有存储哈希,以检测纤程何时从父纤程继承(而不是创建)其存储。
:'[mongoid]:owner'- DATABASE_OVERRIDE_KEY =
'db-override'- CLIENT_OVERRIDE_KEY =
用于覆盖客户端的密钥。
'客户端覆盖'- CURRENT_SCOPE_KEY =
当前线程作用域堆栈的键。
'current-scope'- AUTOSAVES_KEY =
'自动保存'- VALIDATIONS_KEY =
'验证'- TOUCH_MERGED_KEY =
'touch-merged'- STACK_KEYS =
哈希.new do |哈希, key| 哈希[key] = "#{key}-堆栈" end
- SESSIONS_KEY =
当前线程会话的键。
'会话'- MODIFIED_DOCUMENTS_KEY =
用于存储在事务内部修改的文档的密钥。
'Modified-Documents'- EXECUTE_CALLBACKS =
该键存储是否对文档执行回调的默认值。
'执行回调'- BIND =
'bind'- ASSIGN =
'分配'- BUILD =
'构建'- LOAD =
'负载'- CREATE =
'创建'
实例方法摘要折叠
-
#add_modified_document(session, document) ⇒ Object
存储对在与会话关联的ACID 事务中修改的文档的引用。
-
#自动保存? (文档) ⇒ true | false
文档是否在当前线程上自动保存?
-
#autosaves ⇒ Hash
获取当前线程上的所有自动保存。
-
#autosaves_for(klass) ⇒ Array
获取该类的当前线程上的所有自动保存。
-
#begin_autosave(document) ⇒ Object
开始在当前线程上自动保存文档。
-
# begin_execution (name) ⇒ true
开始进入已命名的线程本地堆栈。
-
#begin_touch_merged(document) ⇒ 对象
标记 document 的接触更新已合并到当前线程上的原子插入中。
-
# begin_validate (文档) ⇒ 对象
开始在当前线程上验证文档。
-
# begin_ without_default_scope (klass) ⇒ 对象
private
开始在当前线程上抑制给定模型的默认作用域。
-
#clear_modified_documents(session) ⇒ Set<Mongoid::Document>
清除给设立会话的已修改文档集,并返回清除之前的文档设立内容。
-
#clear_session(client: nil) ⇒ nil
清除客户端为此线程缓存的会话。
-
# client_override ⇒ string |符号
获取全局客户端覆盖。
-
# client_override= (name) ⇒ string |符号
设置全局客户端覆盖。
-
# current_scope (klass = nil) ⇒ 条件
获取当前 Mongoid 作用域。
-
# current_scope= (scope) ⇒ Criteria
设置当前 Mongoid 作用域。
-
# database_override ⇒ string |符号
获取全局数据库覆盖。
-
# database_override= (name) ⇒ string |符号
设置全局数据库覆盖。
-
# 删除 (key) ⇒ 对象
从本地存储中删除已命名的变量。
-
# execute_callbacks= (flag) ⇒ 对象
指示默认是否应为当前线程调用文档回调。
-
#execute_callbacks? ⇒ true | false
查询是否应默认为当前线程执行文档回调。
-
#正在执行? (name) ⇒ true
正在执行指定的堆栈。
-
# exit_autosave (文档) ⇒ 对象
退出当前线程上的文档自动保存功能。
-
# exit_execution (name) ⇒ true
从已命名的线程本地堆栈中退出。
-
#exit_touch_merged(document) ⇒ 对象
清除当前线程上 document 的 touch-merged 标志。
-
# exit_validate (文档) ⇒ 对象
退出验证当前线程上的文档。
-
# exit_Without_default_scope (klass) ⇒ 对象
private
退出,抑制当前线程上给定模型的默认作用域。
-
# get (key, &default) ⇒ 对象 | nil
查询具有给定名称的线程或纤程局部变量。
-
#get_session(client: nil) ⇒ Mongo::Session | nil
获取客户端此线程的缓存会话。
-
# 有? (key) ⇒ true | false
查询本地存储中是否存在命名变量。
-
# Modified_documents ⇒ Hash<Mongo::Session, Set<Mongoid::Document>>
private
返回已修改文档的线程存储。
-
#重置! ⇒ 对象
将当前线程或纤程本地存储重置为其初始状态。
-
#个会话⇒ Hash<Integer, Set>
private
返回会话的线程存储。
-
# 设立 (key, value) ⇒ 对象
将本地存储中具有给定名称的变量设置为给定值。
-
# set_current_scope (scope, klass) ⇒ Criteria
设置当前 Mongoid 作用域。
-
# set_session (session, 客户端: nil) ⇒ 对象
为客户端的该线程缓存会话。
-
# 堆栈 (name) ⇒ 数组
获取命名的堆栈。
-
#touch_merged ⇒ 哈希
GET 所有触摸合并跟踪。
-
#touch_merged?(document) ⇒ true | false
Is the document flagged as having had its touch 更新s merged into an atomic insert?.
-
#touch_merged_for(klass) ⇒ 数组
获取该类的当前线程上的所有触摸合并document ID。
-
#已验证? (文档) ⇒ true | false
文档是否在当前线程上进行了验证?
-
#validations ⇒ Hash
获取当前线程上的所有验证。
-
#validations_for(klass) ⇒ Array
获取类的当前线程上的所有验证。
-
# without_default_scope? (klass) ⇒ 布尔值
private
是否在当前线程上抑制给定 klass 的默认作用域?
实例方法详细信息
#add_modified_document(session, document) ⇒ Object
存储对在与会话关联的ACID 事务中修改的文档的引用。
504 505 506 507 508 |
# File 'lib/mongoid/threaded.rb', 第504行 def add_modified_document(会话, 文档) return 除非 会话&。in_transaction? Modified_documents[会话] << 文档 end |
#自动保存? (文档) ⇒ true | false
文档是否在当前线程上自动保存?
368 369 370 |
# File 'lib/mongoid/threaded.rb', 第368行 def 自动保存?(文档) autosaves_for(文档.class).包括?(文档._id) end |
# autosaves ⇒哈希
获取当前线程上的所有自动保存。
403 404 405 |
# File 'lib/mongoid/threaded.rb', 第403行 def 自动保存 获取(AUTOSAVES_KEY) { {} } end |
#autosaves_for(klass) ⇒ Array
获取该类的当前线程上的所有自动保存。
425 426 427 |
# File 'lib/mongoid/threaded.rb', 第425行 def autosaves_for(klass) 自动保存[klass] ||= [] end |
#begin_autosave(document) ⇒ Object
开始在当前线程上自动保存文档。
198 199 200 |
# File 'lib/mongoid/threaded.rb', 第198行 def begin_autosave(文档) autosaves_for(文档.class).推动(文档._id) end |
# begin_execution (name) ⇒ true
开始进入已命名的线程本地堆栈。
130 131 132 |
# File 'lib/mongoid/threaded.rb', 第130行 def begin_execution(名称) 堆栈(名称).推动(true) end |
#begin_touch_merged(document) ⇒ 对象
标记 document 的接触更新已合并到当前线程上的原子插入中。
219 220 221 |
# File 'lib/mongoid/threaded.rb', 第219行 def begin_touch_merged(文档) touch_merged_for(文档.class).推动(文档._id) end |
# begin_validate (文档) ⇒对象
开始在当前线程上验证文档。
208 209 210 |
# File 'lib/mongoid/threaded.rb', 第208行 def begin_validate(文档) validations_for(文档.class).推动(文档._id) end |
# begin_ without_default_scope (klass) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
开始在当前线程上抑制给定模型的默认作用域。
261 262 263 |
# File 'lib/mongoid/threaded.rb', 第261行 def begin_ without_default_scope(klass) 堆栈(: without_default_scope).推动(klass) end |
# clear_modified_documents (session) ⇒ Set< Mongoid::Document >
清除给设立会话的已修改文档集,并返回清除之前的文档设立内容。
517 518 519 |
# File 'lib/mongoid/threaded.rb', 第517行 def clear_modified_documents(会话) Modified_documents.删除(会话) || [] end |
#clear_session(client: nil) ⇒ nil
为了向后兼容,允许调用此方法而无需
清除客户端为此线程缓存的会话。
指定 client 参数。
494 495 496 |
# File 'lib/mongoid/threaded.rb', 第494行 def clear_session(客户端: nil) 会话.删除(客户端)&。end_session end |
# client_override ⇒ string |符号
获取全局客户端覆盖。
283 284 285 |
# File 'lib/mongoid/threaded.rb', 第283行 def client_override 获取(CLIENT_OVERRIDE_KEY) end |
# client_override= (name) ⇒ String |符号
设置全局客户端覆盖。
295 296 297 |
# File 'lib/mongoid/threaded.rb', 第295行 def client_override=(名称) 集(CLIENT_OVERRIDE_KEY, 名称) end |
# current_scope (klass = nil) ⇒条件
获取当前 Mongoid 作用域。
308 309 310 311 312 313 314 315 316 |
# File 'lib/mongoid/threaded.rb', 第308行 def current_scope(klass = nil) current_scope = 获取(CURRENT_SCOPE_KEY) if klass && current_scope.respond_to?(:keys) current_scope[current_scope.密钥.find { |k| k <= klass }] else current_scope end end |
# current_scope= (scope) ⇒ Criteria
设置当前 Mongoid 作用域。
326 327 328 |
# File 'lib/mongoid/threaded.rb', 第326行 def current_scope=(范围) 集(CURRENT_SCOPE_KEY, 范围) end |
# database_override ⇒ string |符号
获取全局数据库覆盖。
140 141 142 |
# File 'lib/mongoid/threaded.rb', 第140行 def database_override 获取(DATABASE_OVERRIDE_KEY) end |
# database_override= (name) ⇒ string |符号
设置全局数据库覆盖。
152 153 154 |
# File 'lib/mongoid/threaded.rb', 第152行 def database_override=(名称) 集(DATABASE_OVERRIDE_KEY, 名称) end |
# 删除 (key) ⇒ 对象
从本地存储中删除已命名的变量。
109 110 111 |
# File 'lib/mongoid/threaded.rb', 第109行 def 删除(key) 存储空间:.删除(key) end |
# execute_callbacks= (flag) ⇒对象
指示默认情况下是否应为当前线程调用文档回调。 单个文档可以进一步覆盖回调行为,但这将用于默认行为。
543 544 545 |
# File 'lib/mongoid/threaded.rb', 第543行 def execute_callbacks=(flag) 集(EXECUTE_CALLBACKS, flag) end |
#execute_callbacks? ⇒ true | false
查询是否应默认为当前线程执行文档回调。
除非另有说明(通过 #execute_callbacks=),否则返回 true。
529 530 531 532 533 534 535 |
# File 'lib/mongoid/threaded.rb', 第529行 def execute_callbacks? if 有?(EXECUTE_CALLBACKS) 获取(EXECUTE_CALLBACKS) else true end end |
#正在执行? (name) ⇒ true
正在执行指定的堆栈
164 165 166 |
# File 'lib/mongoid/threaded.rb', 第164行 def 正在执行?(名称) !堆栈(名称).空? end |
# exit_autosave (document) ⇒对象
退出当前线程上的文档自动保存功能。
229 230 231 |
# File 'lib/mongoid/threaded.rb', 第229行 def exit_autosave(文档) autosaves_for(文档.class).delete_one(文档._id) end |
# exit_execution (name) ⇒ true
从已命名的线程本地堆栈中退出。
176 177 178 |
# File 'lib/mongoid/threaded.rb', 第176行 def exit_execution(名称) 堆栈(名称).Pop end |
#exit_touch_merged(document) ⇒ 对象
清除当前线程上 document 的 touch-merged 标志。
249 250 251 |
# File 'lib/mongoid/threaded.rb', 第249行 def exit_touch_merged(文档) touch_merged_for(文档.class).delete_one(文档._id) end |
# exit_validate (文档) ⇒对象
退出验证当前线程上的文档。
239 240 241 |
# File 'lib/mongoid/threaded.rb', 第239行 def exit_validate(文档) validations_for(文档.class).delete_one(文档._id) end |
# exit_Without_default_scope (klass) ⇒对象
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
退出,抑制当前线程上给定模型的默认作用域。
273 274 275 |
# File 'lib/mongoid/threaded.rb', 第273行 def exit_Without_default_scope(klass) 堆栈(: without_default_scope).删除(klass) end |
# get (key, &default) ⇒ 对象 | nil
查询具有给定名称的线程或纤程局部变量。如果给定了一个区块,并且该变量尚不存在,则在返回该变量之前,该区块的返回值将被设立为该变量的值。
应用程序(尤其是 Mongoid)使用此方法而不是 Thread#[] 非常重要,因为 Thread#[] 实际上用于纤程局部变量,而 Mongoid 在某些回调中使用纤程作为实施细节。将线程本地状态放入纤程本地存储中将导致当相关回调在不同纤程中运行时,状态不可见。
受影响的回调是针对嵌入式子项的级联回调。
84 85 86 87 88 89 90 91 92 93 |
# File 'lib/mongoid/threaded.rb', 第84行 def 获取(key, 和访问) 结果 = 存储空间:[key] if 结果.nil? && 访问 结果 = 产量 集(key, 结果) end 结果 end |
#get_session(client: nil) ⇒ Mongo::Session | nil
为了向后兼容,允许调用此方法而无需
获取客户端此线程的缓存会话。
指定 client 参数。
482 483 484 |
# File 'lib/mongoid/threaded.rb', 第482行 def get_session(客户端: nil) 会话[客户端] end |
# 有? (key) ⇒ true | false
查询本地存储中是否存在命名变量。
118 119 120 |
# File 'lib/mongoid/threaded.rb', 第118行 def 有?(key) 存储空间:.键?(key) end |
# Modified_documents ⇒ Hash<Mongo::Session, Set< Mongoid::Document >>
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回已修改文档的线程存储。
562 563 564 |
# File 'lib/mongoid/threaded.rb', 第562行 def Modified_documents 获取(MODIFIED_DOCUMENTS_KEY) { 哈希.new { |h, k| h[k] = 集.new } } end |
# 重置! ⇒ 对象
将当前线程或纤程本地存储重置为其初始状态。这对于在启动新线程或纤程时确保状态干净非常有用。
Mongoid::Config.real_isolation_level 的值用于确定是否重置当前线程或纤程的存储。
53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mongoid/threaded.rb', 第53行 def reset! 案例 配置.real_isolation_level when :thread 线程.Current.thread_variable_set(STORAGE_KEY, nil) when :Fiber 光纤[STORAGE_KEY] = {} 光纤[STORAGE_OWNER_KEY] = 光纤.Current.object_id else 提高 " 隔离性 : #{Config.real_isolation_level.inspect} " end end |
#个会话⇒ Hash<Integer, Set>
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
返回会话的线程存储。
552 553 554 |
# File 'lib/mongoid/threaded.rb', 第552行 def 会话 获取(SESSIONS_KEY) { {}.compare_by_identity } end |
# 设立 (key, value) ⇒ 对象
将本地存储中具有给定名称的变量设置为给定值。有关为什么需要此方法的讨论,以及为什么在嵌入式子项的级联回调中应避免使用 Thread#[]=,请参阅 #get。
102 103 104 |
# File 'lib/mongoid/threaded.rb', 第102行 def 集(key, 值) 存储空间:[key] = 值 end |
# set_current_scope (scope, klass) ⇒ Criteria
设置当前 Mongoid 作用域。 可安全用于多模型作用域链。
339 340 341 342 343 344 345 346 |
# File 'lib/mongoid/threaded.rb', 第339行 def set_current_scope(范围, klass) if 范围.nil? unset_current_scope(klass) else current_scope = 获取(CURRENT_SCOPE_KEY) { {} } current_scope[klass] = 范围 end end |
# set_session (session, 客户端: nil) ⇒对象
为了向后兼容,允许调用此方法而无需
为客户端的该线程缓存会话。
指定 client 参数。
470 471 472 |
# File 'lib/mongoid/threaded.rb', 第470行 def set_session(会话, 客户端: nil) 会话[客户端] = 会话 end |
# stack (name) ⇒数组
获取命名的堆栈。
188 189 190 |
# File 'lib/mongoid/threaded.rb', 第188行 def 堆栈(名称) 获取(STACK_KEYS[名称]) { [] } end |
# touch_merged ⇒ 哈希
GET 所有触摸合并跟踪。
447 448 449 |
# File 'lib/mongoid/threaded.rb', 第447行 def touch_merged 获取(TOUCH_MERGED_KEY) { {} } end |
#touch_merged?(document) ⇒ true | false
Is the document flagged as having had its touch 更新s merged into an atomic insert?
393 394 395 |
# File 'lib/mongoid/threaded.rb', 第393行 def touch_merged?(文档) touch_merged_for(文档.class).包括?(文档._id) end |
# touch_merged_for (klass) ⇒ 数组
获取该类的当前线程上的所有触摸合并document ID。
459 460 461 |
# File 'lib/mongoid/threaded.rb', 第459行 def touch_merged_for(klass) touch_merged[klass] ||= [] end |
#已验证? (document) ⇒ true | false
文档是否在当前线程上进行了验证?
380 381 382 |
# File 'lib/mongoid/threaded.rb', 第380行 def 已验证?(文档) validations_for(文档.class).包括?(文档._id) end |
# validations ⇒哈希
获取当前线程上的所有验证。
413 414 415 |
# File 'lib/mongoid/threaded.rb', 第413行 def 验证 获取(VALIDATIONS_KEY) { {} } end |
#validations_for(klass) ⇒ Array
获取类的当前线程上的所有验证。
437 438 439 |
# File 'lib/mongoid/threaded.rb', 第437行 def validations_for(klass) 验证[klass] ||= [] end |
# without_default_scope? (klass) ⇒布尔值
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
是否在当前线程上抑制给定 klass 的默认作用域?
356 357 358 |
# File 'lib/mongoid/threaded.rb', 第356行 def without_default_scope?(klass) 堆栈(: without_default_scope).包括?(klass) end |