类:Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy

继承:
Mongoid::Association::Referenced::HasMany::Proxy 显示全部
扩展方式:
类方法
定义于:
lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb

Overview

has_and_belongs_to_many 关联的透明代理。 对主题文档调用关联 getter 方法时,将返回此类的实例。 该类继承自 Mongoid::Association::Proxy,并将其大部分方法转发到关联的目标,即必须加载的对方集合上的文档大量。

在命名空间下定义

模块: 类方法

常量摘要

Proxy继承的常量

Proxy::KEEPER_METHODS

实例属性摘要

Proxy继承的属性

#_association#_base#_target

实例方法摘要折叠

类方法中包含的方法

ager_loader嵌入式?

Mongoid::Association::Referenced::HasMany::Proxy继承的方法

#delete_all#destroy_all#each#exists?#find#initialize

Mongoid::Association::Referenced::HasMany::Proxy::ClassMethods 中包含的方法

#eager_loader#embedded?

Many继承的方法

#blank?#create#create! , #find_or_create_by , #find_or_create_by!#find_or_initialize_by#nil? , #respond_to?#scoped#serializable_hash

Proxy继承的方法

apply_ordering#extend_proxies#initialize#klass#reset_unloaded#substitutable

包含在封送处理中的方法

#marshal_dump#marshal_load

构造函数详情

该类从Mongoid::Association::Referenced::HasMany::Proxy继承构造函数

动态方法处理

该类通过 Mongoid::Association::Referenced::HasMany::Proxy 类中的 method_missing 方法处理动态方法

实例方法详细信息

# << (*args) ⇒ Array< Document >也称为: push

将文档或文档数组附加到关联中。 将在此进程中设置父项并更新索引。

rubocop:disable Metrics/AbcSize

例子:

附加文档。

person.posts << post

推送文档。

person.posts.push(post)

与其他文档连接。

person.posts.concat([ post_one, post_two ])

参数:

  • *args (文档... )

    任意数量的文档。

返回:

  • ( Array< Document > )

    加载的Docs 。



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
84
85
86
87
88
89
90
91
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 58

def <<(*args)
  docs = args.展平
  return concat(docs) if docs.size > 1

  if (doc = docs.first)
    附加(doc) do
      # 我们忽略对 中的外键值的更改
      此代码区块中的 #changed_attributes 哈希有两个原因:
      #
      # 1 ) add_to_set 方法删除外部
      # 键入 Changed_attributes 哈希值,但如果我们输入
      # 方法,其外键值位于
      # Changed_attributes 哈希,那么我们希望它存在于外部
      # 也是这个方法。 它稍后会在 Syncable
      # 用于设置反向外键的模块。
      # 2 ) reset_unloaded 方法访问外部
      # _base 上的键,这会导致它被添加到
      # Changed_attributes 哈希值。 发生这种情况是因为读取时
      # 一个“可调整大小”属性,它会自动添加到
      # Changed_attributes 哈希值。 这只适用于外国
      # HABTM 关联的键值与其他关联相同
      # 使用字符串作为外键值。 为了一致性
      # 与其他关联,我们忽略此添加
      # Changed_attributes 哈希值。
      # 有关此问题的更长讨论,请参阅 MONGOID- 4843 。
      reset_foreign_key_changes do
        _base.add_to_set(foreign_key => doc.public_send(_association.primary_key))
        doc.保存 if child_persistable?(doc)
        reset_unloaded
      end
    end
  end
  未同步(_base, foreign_key)  self
end

# build (attributes = {}, type = nil) {|doc| ... } ⇒文档也称为: new

从属性构建新文档并将其附加到此关联而不保存。

例子:

在关联上构建新文档。

person.posts.build(:title => "A new post")

参数:

  • 属性 哈希 (默认为: {}

    新文档的属性。

  • 类型 ( class ) (默认为: nil

    要构建的可选子类。

产量:

  • ( doc )

返回:



123
124
125
126
127
128
129
130
131
132
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 123

def 构建(属性 = {}, 类型 = nil)
  doc = 工厂.execute_build(类型 || klass, 属性, execute_callbacks: false)
  附加(doc)
  doc.apply_post_processed_defaults
  _base.public_send(foreign_key).推动(doc.public_send(_association.primary_key))
  未同步(doc, inverse_foreign_key)
  产量(doc) if block_given?
  doc.run_pending_callbacks
  doc
end

# concat (documents) ⇒ Array< Document >

将文档数组附加到关联中。 对文档执行批量插入,而不是一次持久保存一个文档。

例子:

与其他文档连接。

person.posts.concat([ post_one, post_two ])

参数:

  • 文档 ( Array< Document > )

    要添加的Docs 。

返回:



105
106
107
108
109
110
111
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 105

def concat(文档)
  id, docs, inserts = {}, [], []
  文档. { |doc| append_document(doc, id, docs, inserts) }
  _base.推动(foreign_key => id.密钥) if 持久化? || _creating?
  persist_delayed(docs, inserts)
  self
end

# delete (document) ⇒ Document也称为: delete_one

从关联中删除文档。 这会将文档的外键设置为零。 如果关联上的依赖选项是 :delete_all 或 :destroy,则会进行相应的删除。

例子:

删除文档。

person.posts.delete(post)

参数:

  • 文档 (文档)

    要删除的文档。

返回:

  • (文档)

    匹配的文档。



146
147
148
149
150
151
152
153
154
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 146

def 删除(文档)
  doc = 
  if doc && 持久化?
    _base.pull(foreign_key => doc.public_send(_association.primary_key))
    _target._unloaded = 条件
    未同步(_base, foreign_key)
  end
  doc
end

# nullify (replacement = []) ⇒ Object也称为: nullify_allclearpurge

通过删除外键和引用来删除基本文档和目标文档之间的所有关联,并在此过程中孤立目标文档。

例子:

取消关联。

person.preferences.nullify

参数:

  • 替换 ( Array< Document > ) (默认为: []

    替换文档。



168
169
170
171
172
173
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 168

def nullify(替换 = [])
  _target. { |doc| execute_callback :before_remove, doc }
  cleanup_inverse_for(替换) 除非 _association.forced_nil_inverse?
  _base.(foreign_key => _base.public_send(foreign_key).清除) if 持久化?
  clear_target_for_nullify
end

# Replacement (replacement) ⇒ Many

用提供的目标文档替换关联中的现有文档。 如果新目标为零,则执行必要的删除。

Person.preferences.substitute([ new_post ])

例子:

替换关联。

参数:

  • 替换 ( Array< Document > )

    替换目标。

返回:

  • ( Many )

    关联。



189
190
191
192
193
194
195
196
197
198
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 189

def 替换(替换)
  purge(替换)
  if 替换.空白?
    reset_unloaded
    clear_foreign_key_changes
  else
    推动(替换.compact.uniq)
  end
  self
end

# unscoped条件

获取未应用默认范围的文档条件。

例子:

获取未指定范围的条件。

person.preferences.unscoped

返回:

  • ( Criteria )

    未限定范围的条件。



207
208
209
# File 'lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb', line 207

def 未限定作用域
  klass.未限定作用域.any_in(_id: _base.public_send(foreign_key))
end