- C
- I
- L
- N
- P
- Q
- R
- S
- T
实例公共方法
column_defaults() 链接
返回一个哈希,其中键是列名,值是在实例化此表的 ActiveRecord 对象时使用的默认值。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 472 def column_defaults load_schema @column_defaults ||= _default_attributes.deep_dup.to_hash.freeze end
column_for_attribute(name) 链接
返回指定属性的列对象。如果指定属性不存在,则返回 ActiveRecord::ConnectionAdapters::NullColumn。
class Person < ActiveRecord::Base
end
person = Person.new
person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
# => #<ActiveRecord::ConnectionAdapters::Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>
person.column_for_attribute(:nothing)
# => #<ActiveRecord::ConnectionAdapters::NullColumn:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 463 def column_for_attribute(name) name = name.to_s columns_hash.fetch(name) do ConnectionAdapters::NullColumn.new(name) end end
column_names() 链接
返回一个包含列名(字符串)的数组。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 478 def column_names @column_names ||= columns.map(&:name).freeze end
columns() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 432 def columns @columns ||= columns_hash.values.freeze end
content_columns() 链接
返回一个包含列对象的数组,其中去除了主键 ID、所有以“_id”或“_count”结尾的列以及用于单表继承的列。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 489 def content_columns @content_columns ||= columns.reject do |c| c.name == primary_key || c.name == inheritance_column || c.name.end_with?("_id", "_count") end.freeze end
ignored_columns() 链接
模型应忽略的列名列表。被忽略的列将不会有属性访问器定义,也不会在 SQL 查询中引用。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 331 def ignored_columns @ignored_columns || superclass.ignored_columns end
ignored_columns=(columns) 链接
设置模型应忽略的列名列表。被忽略的列将不会有属性访问器定义,也不会在 SQL 查询中引用。
此方法的一个常见用法模式是在确保已删除并部署对某个属性的所有引用后,再部署和运行从数据库中删除该列的迁移。使用这种两步式方法来删除列,可以确保在运行模式迁移时,没有代码因当时内存中缓存的模式而引发错误。
例如,假设您想从模型中删除“category”属性,首先将其标记为忽略
class Project < ActiveRecord::Base
# schema:
# id :bigint
# name :string, limit: 255
# category :string, limit: 255
self.ignored_columns += [:category]
end
模式仍然包含“category”,但现在模型省略了它,因此任何元驱动代码或模式缓存都不会尝试使用该列
Project.columns_hash["category"] => nil
如果直接访问该属性,您会收到错误,因此请确保删除了该列的所有使用(自动化测试可以帮助您找到任何使用)。
user = Project.create!(name: "First Project")
user.category # => raises NoMethodError
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 366 def ignored_columns=(columns) reload_schema_from_cache @ignored_columns = columns.map(&:to_s).freeze end
load_schema() 链接
从模式缓存或直接从数据库中加载模型的模式信息。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 534 def load_schema return if schema_loaded? @load_schema_monitor.synchronize do return if schema_loaded? load_schema! @schema_loaded = true rescue reload_schema_from_cache # If the schema loading failed half way through, we must reset the state. raise end end
next_sequence_value() 链接
返回将在插入语句中用作主键的下一个值。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 411 def next_sequence_value with_connection { |c| c.next_sequence_value(sequence_name) } end
prefetch_primary_key?() 链接
确定是否应该在插入语句之前从其对应的序列中选择主键值。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 405 def prefetch_primary_key? with_connection { |c| c.prefetch_primary_key?(table_name) } end
protected_environments() 链接
禁止破坏性操作的环境名称数组。默认情况下,值为 ["production"]
。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 312 def protected_environments if defined?(@protected_environments) @protected_environments else superclass.protected_environments end end
protected_environments=(environments) 链接
设置禁止破坏性操作的环境名称数组。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 321 def protected_environments=(environments) @protected_environments = environments.map(&:to_s) end
quoted_table_name() 链接
返回表名的引用版本。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 285 def quoted_table_name adapter_class.quote_table_name(table_name) end
reset_column_information() 链接
重置所有关于列的缓存信息,这将导致它们在下一次请求时重新加载。
此方法最常见的用法模式可能是在迁移中,您在创建表后立即想要用一些默认值填充它,例如
class CreateJobLevels < ActiveRecord::Migration[8.0]
def up
create_table :job_levels do |t|
t.integer :id
t.string :name
t.timestamps
end
JobLevel.reset_column_information
%w{assistant executive manager director}.each do |type|
JobLevel.create(name: type)
end
end
def down
drop_table :job_levels
end
end
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 523 def reset_column_information connection_pool.active_connection&.clear_cache! ([self] + descendants).each(&:undefine_attribute_methods) schema_cache.clear_data_source_cache!(table_name) reload_schema_from_cache initialize_find_by_cache end
sequence_name() 链接
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 371 def sequence_name if base_class? @sequence_name ||= reset_sequence_name else (@sequence_name ||= nil) || base_class.sequence_name end end
sequence_name=(value) 链接
将用于生成 ID 的序列名称设置为给定值,或者(如果该值是 nil
或 false
)设置为给定块返回的值。这对于 Oracle 是必需的,并且对任何依赖于序列进行主键生成的数据库都有用。
如果使用 Oracle 时没有显式设置序列名称,它将默认为常用的模式:#{table_name}_seq
如果使用 PostgreSQL 时没有显式设置序列名称,它将为您发现与您的主键相对应的序列。
class Project < ActiveRecord::Base
self.sequence_name = "projectseq" # default would have been "project_seq"
end
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 398 def sequence_name=(value) @sequence_name = value.to_s @explicit_sequence_name = true end
table_exists?() 链接
指示与该类关联的表是否存在
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 416 def table_exists? schema_cache.data_source_exists?(table_name) end
table_name() 链接
根据继承层次结构中直接从 ActiveRecord::Base
下降的类的名称(强制转换为小写)推测表名。因此,如果层次结构看起来像这样:Reply < Message < ActiveRecord::Base
,那么即使在 Reply 上调用,也会使用 Message 来推测表名。用于执行推测的规则由 Active Support 中的 Inflector 类处理,该类知道几乎所有常见的英语词形变化。您可以在 config/initializers/inflections.rb 中添加新的词形变化。
嵌套类将被赋予以父类表名的单数形式为前缀的表名。不会考虑封闭的模块。
示例
class Invoice < ActiveRecord::Base
end
file class table_name
invoice.rb Invoice invoices
class Invoice < ActiveRecord::Base
class Lineitem < ActiveRecord::Base
end
end
file class table_name
invoice.rb Invoice::Lineitem invoice_lineitems
module Invoice
class Lineitem < ActiveRecord::Base
end
end
file class table_name
invoice/lineitem.rb Invoice::Lineitem lineitems
此外,会添加类级 table_name_prefix
作为前缀,并添加 table_name_suffix
作为后缀。因此,如果您将“myapp_”作为前缀,Invoice 类的表名推测将变为“myapp_invoices”。Invoice::Lineitem 将变为“myapp_invoice_lineitems”。
Active Model Naming 的 model_name
是用于推测表名的基本名称。如果定义了自定义 Active Model Name,它也将用于表名
class PostRecord < ActiveRecord::Base
class << self
def model_name
ActiveModel::Name.new(self, nil, "Post")
end
end
end
PostRecord.table_name
# => "posts"
您也可以显式设置自己的表名
class Mouse < ActiveRecord::Base
self.table_name = "mice"
end
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/model_schema.rb, line 260 def table_name reset_table_name unless defined?(@table_name) @table_name end
table_name=(value) 链接
显式设置表名。示例
class Project < ActiveRecord::Base
self.table_name = "project"
end
# File activerecord/lib/active_record/model_schema.rb, line 270 def table_name=(value) value = value && value.to_s if defined?(@table_name) return if value == @table_name reset_column_information if connected? end @table_name = value @arel_table = nil @sequence_name = nil unless @explicit_sequence_name @predicate_builder = nil end
实例保护方法
initialize_load_schema_monitor() 链接
reload_schema_from_cache(recursive = true) 链接
# File activerecord/lib/active_record/model_schema.rb, line 553 def reload_schema_from_cache(recursive = true) @_returning_columns_for_insert = nil @arel_table = nil @column_names = nil @symbol_column_to_string_name_hash = nil @content_columns = nil @column_defaults = nil @attributes_builder = nil @columns = nil @columns_hash = nil @schema_loaded = false @attribute_names = nil @yaml_encoder = nil if recursive subclasses.each do |descendant| descendant.send(:reload_schema_from_cache) end end end