模块:Mongoid::Fields

扩展方式:
ActiveSupport::Concern
包含在:
可组合
定义于:
lib/mongoid/fields.rb ,
lib/mongoid/fields/standard.rb,
lib/mongoid/fields/ 加密,
lib/mongoid/fields/localized.rb,
lib/mongoid/fields/foreign_key.rb,
lib/mongoid/fields/validators/macro.rb

Overview

此模块定义字段的行为。

在命名空间下定义

模块:方法验证器类: EncryptedForeignKeyLocalizedStandard

常量摘要折叠

StringifiedSymbol =
Mongoid::StringifiedSymbol
布尔 =
Mongoid::布尔
TYPE_MAPPINGS =

对于使用符号定义的字段,请使用正确的类。

{
  大量: 阵列,
  big_decimal: BigDecimal,
  二进制: BSON::二进制文件,
  布尔值: Mongoid::布尔,
  日期: Date,
  date_time: 日期时间,
  float: Float,
  哈希: 哈希,
  整数: 整型,
  object_id: BSON::ObjectId,
  范围: 范围,
  regexp: regexp,
  设立: ,
  string : 字符串,
  stringified_symbol: StringifiedSymbol,
  符号: 符号,
  时间: 时间
}.with_indifference_access
IDS =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

文档中_id字段的所有名称的常量。

这不包括_id字段的别名。

[ :_id, '_id', ].冻结
INVALID_BSON_CLASSES =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

不支持将BSON类作为字段类型

[ BSON::Decimal128, BSON::Int32, BSON::Int64 ].冻结
TRANSLATIONS_SFX =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

生成的已翻译字段的后缀。

'_translations'

类方法摘要折叠

实例方法摘要折叠

类方法详细信息

database_field_name (name,relations, aliased_fields, aliased_associations) ⇒ string

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

获取所提供字段存储在数据库中的名称。 用于确定字段是否有别名。 以递归方式查找嵌入式文档和字段的别名,用句点“.”分隔。字符。

请注意,此方法返回存储在数据库中的关联名称,而“关系”哈希使用其代码内别名。 为了检查关系哈希中的成员资格,首先必须在 aliased_associations 哈希中查找从此方法返回的string 。

此方法不会展开不是最后一项的 Belongs_to 关联的别名。 示例,如果有一所学校 has_many 学生,并且传递的字段名称为(从学生的角度来看):

school._id

belongs_to 关联的别名是该关联的 _id 字段。 因此,扩展此关联将产生:

school_id._id

这不是正确的字段名称,因为此处的目的不是获取_id字段的属性。 目的是获取引用文档的属性。 因此,如果传递的名称的一部分是belongs_to关联,而不是名称的最后部分,则不会扩展其别名,并返回:

school._id

如果 belongs_to 关联是名称的最后部分,我们将传回_id字段。

参数:

  • 名称 ( string | Symbol )

    要获取的名称。

  • 关系 (哈希)

    关联。

  • aliased_fields (哈希)

    带别名的字段。

  • aliased_associations (哈希)

    带别名的关联。

返回:

  • ( string )

    存储在数据库中的字段名称。



415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
# File 'lib/mongoid/fields.rb', line 415

def database_field_name(名称, 关系, aliased_fields, aliased_associations)
  return " " 除非 名称.现在?

  key = 名称.to_s
  分段, 剩余 = key.拆分('  ', 2)

  # 当存在 belongs_to 关联时,不获取字段的别名
  # 不是最后一项。 因此,当以下任一情况时获取别名:
  # 以下为 true:
  # 1 . 这是最后一项,即没有剩余。
  # 2 . 它不是关联。
  # 3 . 它不是归属关联
  if !剩余 || !关系.键?(分段) || !关系[分段].is_a?(关联::引用::属于关联)
    分段 = aliased_fields[分段]&。dup || 分段
  end

  return 分段 除非 剩余

  关系 = 关系[aliased_associations[分段] || 分段]
  if 关系
    k = 关系.klass
    " #{ egment}. #{ database_field_name( remaining, k.relations, k.aliased_fields, k.aliased_associations)} "
  else
    " #{ section } . #{剩下的} "
  end
end

选项(option_name, &block) ⇒对象

存储在字段上定义指定选项名称时要运行的提供的区块。

对于处理程序可能执行的功能没有做出任何假设,因此如果字段定义中提供了“option_name”键,即使该键为 false 或 nil,也将始终调用该处理程序。

例子:

Mongoid::Fields.option :required do |model, field, value|
  model.validates_presence_of field if value
end

参数:

  • option_name (符号)

    要匹配的选项名称

  • 区块(&B)

    提供该选项时要执行的处理程序。



298
299
300
# File 'lib/mongoid/fields.rb', line 298

def 选项(option_name, )
  选项[option_name] = 
end

.optionsHash

将自定义选项名称的映射返回到其处理程序。

例子:

Mongoid::Fields.options
# => { :required => #<Proc:0x00000100976b38> }

返回:

  • (哈希)

    选项映射



309
310
311
# File 'lib/mongoid/fields.rb', line 309

def 选项
  @options ||= {}
end

traverse_association_tree (key, fields,associations, aliased_associations) {|The, The,是否| ... } ⇒字段

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

向下遍历关联树并搜索给定键的字段。 为此,请用“.”分割键对于密钥的每个部分(方法):

  • 如果方法为字段,则将方法、 字段和 is_field 设为 true 。

  • 如果该方法是关联,则将 klass更新为关联的 klass,并将 meth、klass 和 is_field 生成为 false。

下一次迭代将使用 klass 的字段和关联继续遍历树。

参数:

  • key ( string )

    用于搜索关联树的键。

  • 字段 (哈希)

    开始搜索的字段。

  • 关联 (哈希)

    开始搜索的关联。

  • aliased_associations (哈希)

    开始搜索的别名关联。

  • 区块(&B)

    区块。

收益参数:

  • 使用 (符号)

    当前方法。

  • 使用 (符号 | string )

    字段或关系。

  • 是否 ( true | false )

    第二个让出参数是否为字段。

返回:

  • (字段)

    搜索结束时为给定键找到的字段。 如果找到的最后一个是关联或者没有找到给定键的字段,则返回 nil。



340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
# File 'lib/mongoid/fields.rb', line 340

def traverse_association_tree(key, 字段, 关联, aliased_associations)
  klass = nil
  字段 = nil
  key.拆分('  ').each_with_index do |meth, i|
    fs = i == 0 ? 字段 : klass&。字段
    rs = i == 0 ? 关联 : klass&。关系
    作为 = i == 0 ? aliased_associations : klass&。aliased_associations

    # 关联可能有两个“键”,即名称和别名。
    # 字段名称是用于将其存储在 klass 关系中的名称
    # 和字段哈希,别名是用于存储该字段的内容
    # 在数据库中。 输入到此函数的密钥是具有别名的
    # key. 我们可以通过查看
    # aliased_associations 哈希值。
    别名 = meth
    if 作为 && a = 作为.获取(meth, nil)
      别名 = a.to_s
    end

    字段 = nil
    klass = nil
    if fs && f = fs[别名]
      字段 = f
      产量(meth, f, true) if block_given?
    elsif rs && rel = rs[别名]
      klass = rel.klass
      产量(meth, rel, false) if block_given?
    else
      产量(meth, nil, false) if block_given?
    end
  end
  字段
end

实例方法详细信息

# apply_default (name) ⇒对象

对给定名称应用单个默认值。

例子:

应用单个默认。

model.apply_default("name")

参数:

  • 名称 ( string )

    字段的名称。



183
184
185
186
187
188
189
190
191
192
193
# File 'lib/mongoid/fields.rb', line 183

def apply_default(名称)
  除非 属性.键?(名称)
    if 字段 = 字段[名称]
      访问 = 字段.eval_default(self)
      除非 访问.nil? || 字段.懒?
        attribute_will_change!(名称)
        属性[名称] = 访问
      end
    end
  end
end

# apply_defaults对象

立即应用所有默认值。

例子:

应用所有默认值。

model.apply_defaults


199
200
201
202
203
# File 'lib/mongoid/fields.rb', line 199

def apply_defaults
  pending_callbacks.删除(:apply_defaults)
  apply_pre_processed_defaults
  apply_post_processed_defaults
end

# apply_post_processed_defaultsArray<String>

将所有默认值应用于文档,即 procs。

例子:

应用所有 proc 默认值。

model.apply_post_processed_defaults

返回:

  • ( Array<String> )

    过程默认值的名称。



170
171
172
173
174
175
# File 'lib/mongoid/fields.rb', line 170

def apply_post_processed_defaults
  pending_callbacks.删除(:apply_post_processed_defaults)
  post_processed_defaults. do |名称|
    apply_default(名称)
  end
end

#apply_pre_processed_defaultsArray<String>

将所有不是过程的默认值应用于文档。

例子:

应用所有非 proc 默认值。

model.apply_pre_processed_defaults

返回:

  • ( Array<String> )

    非过程默认值的名称。



158
159
160
161
162
# File 'lib/mongoid/fields.rb', line 158

def apply_pre_processed_defaults
  pre_processed_defaults. do |名称|
    apply_default(名称)
  end
end

#attribute_namesArray<String>

返回此对象可用属性的名称大量。

以与 ORM 无关的方式提供字段名称。 Rails v 3.1 + 使用此方法自动包装JSON请求中的参数。

例子:

获取字段名称

document.attribute_names

返回:

  • ( Array<String> )

    字段名称



214
215
216
# File 'lib/mongoid/fields.rb', line 214

def attribute_names
  self.class.attribute_names
end

# database_field_name (name) ⇒ string

获取所提供字段存储在数据库中的名称。 用于确定字段是否有别名。

例子:

获取数据库字段名称。

model.database_field_name(:authorization)

参数:

  • 名称 ( string | Symbol )

    要获取的名称。

返回:

  • ( string )

    存储在数据库中的字段名称。



227
228
229
# File 'lib/mongoid/fields.rb', line 227

def database_field_name(名称)
  self.class.database_field_name(名称)
end

# dot_dollar_field? (name) ⇒ true | false

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

此字段是以美元符号 ($) 开头还是包含点/句点 (.)?

参数:

  • 名称 ( string )

    字段名称。

返回:

  • ( true | false )

    如果此字段为虚线或美元符号。



263
264
265
266
# File 'lib/mongoid/fields.rb', line 263

def dot_dollar_field?(名称)
  n = aliased_fields[名称] || 名称
  字段.键?(n) && (n.包括?('  ') || n.start_with?('$'))
end

#lazy_settable? (字段,值) ⇒ true | false

提供的字段是否为延迟求值?

例子:

如果字段是延迟可设置的。

doc.lazy_settable?(field, nil)

参数:

  • 字段 (字段)

    字段。

  • ( Object )

    当前值。

返回:

  • ( true | false )

    如果我们延迟设置字段。



240
241
242
# File 'lib/mongoid/fields.rb', line 240

def lazy_settable?(字段, )
  !冻结? && .nil? && 字段.懒?
end

# using_object_id?true | false

注意:

通过使用委托进行重构以提高类加载性能。

文档是否使用对象ID?

例子:

文档是否使用对象ID?

model.using_object_ids?

返回:

  • ( true | false )

    使用对象ID。



252
253
254
# File 'lib/mongoid/fields.rb', line 252

def using_object_id?
  self.class.using_object_id?
end

# validate_writable_field_name! (name) ⇒对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

验证该字段是否以美元符号 ($) 开头或包含点/句点 (.)。

参数:

  • 名称 ( string )

    字段名称。

引发:

  • ( InvalidDotDollarAssignment )

    如果包含点或以美元开头。



276
277
278
279
280
# File 'lib/mongoid/fields.rb', line 276

def validate_writable_field_name!(名称)
  if dot_dollar_field?(名称)
    提高 Errors::InvalidDotDollarAssignment.new(self.class, 名称)
  end
end