модуль ActiveRecord::Core
Публичные методы класса
Возвращает полностью разрешённый хеш конфигураций
# File activerecord/lib/active_record/core.rb, line 51 def self.configurations @@configurations end
:singleton-method: Содержит конфигурацию базы данных — как обычно хранится в config/database.yml — в виде хеша.
Например, следующий database.yml…
development: adapter: sqlite3 database: db/development.sqlite3 production: adapter: sqlite3 database: db/production.sqlite3
…приведёт к тому, что ::configurations будет выглядеть так:
{
'development' => {
'adapter' => 'sqlite3',
'database' => 'db/development.sqlite3'
},
'production' => {
'adapter' => 'sqlite3',
'database' => 'db/production.sqlite3'
}
}
# File activerecord/lib/active_record/core.rb, line 45 def self.configurations=(config) @@configurations = ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve end
# File activerecord/lib/active_record/core.rb, line 97 def self.connection_handler ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler end
# File activerecord/lib/active_record/core.rb, line 101 def self.connection_handler=(handler) ActiveRecord::RuntimeRegistry.connection_handler = handler end
# File activerecord/lib/active_record/core.rb, line 90
def self.disable_implicit_join_references=(value)
ActiveSupport::Deprecation.warn("Implicit join references were removed with Rails 4.1." "Make sure to remove this configuration because it does nothing.")
end Новые объекты могут быть созданы либо пустыми (не передавать параметры), либо предварительно заполненными атрибутами, но ещё не сохранёнными (передать хеш с именами ключей, соответствующими именам столбцов связанной таблицы). В обоих случаях допустимые ключи атрибутов определяются именами столбцов связанной таблицы — поэтому у вас не может быть атрибутов, которые не являются частью столбцов таблицы.
Пример:
# Instantiates a single new object User.new(first_name: 'Jamie')
# File activerecord/lib/active_record/core.rb, line 182
def initialize(attributes = nil, options = {})
defaults = self.class.column_defaults.dup
defaults.each { |k, v| defaults[k] = v.dup if v.duplicable? }
@attributes = self.class.initialize_attributes(defaults)
@column_types_override = nil
@column_types = self.class.column_types
init_internals
initialize_internals_callback
# +options+ argument is only needed to make protected_attributes gem easier to hook.
# Remove it when we drop support to this gem.
init_attributes(attributes, options) if attributes
yield self if block_given?
run_callbacks :initialize unless _initialize_callbacks.empty?
end Публичные методы экземпляров
Разрешает сортировку по объектам
# File activerecord/lib/active_record/core.rb, line 327
def <=>(other_object)
if other_object.is_a?(self.class)
self.to_key <=> other_object.to_key
else
super
end
end Возвращает true, если comparison_object является тем же самым объектом, или comparison_object имеет тот же тип и self имеет ID, равный comparison_object.id.
Обратите внимание, что новые записи по определению отличаются от любых других записей, если только другая запись не является самим получателем. Кроме того, если вы получаете существующие записи с select и опускаете ID, вам придётся самим позаботиться об этом; этот предикат вернёт false.
Обратите также внимание, что удаление записи сохраняет её ID в экземпляре модели, поэтому удалённые модели всё ещё сравнимы.
# File activerecord/lib/active_record/core.rb, line 299
def ==(comparison_object)
super ||
comparison_object.instance_of?(self.class) &&
!id.nil? &&
comparison_object.id == id
end Идентично методу clone в Ruby. Это «поверхностная» копия. Будьте осторожны, ваши атрибуты не копируются. Это означает, что изменение атрибутов копии изменит оригинал, так как они оба будут указывать на одну и ту же хеш-таблицу атрибутов. Если вам нужна копия хеш-таблицы ваших атрибутов, пожалуйста, используйте метод dup.
user = User.first new_user = user.clone user.name # => "Bob" new_user.name = "Joe" user.name # => "Joe" user.object_id == new_user.object_id # => false user.name.object_id == new_user.name.object_id # => true user.name.object_id == user.dup.name.object_id # => false
# File activerecord/lib/active_record/core.rb, line 245
# File activerecord/lib/active_record/core.rb, line 346 def connection_handler self.class.connection_handler end
Дублированные объекты не имеют назначенного id и обрабатываются как новые записи. Обратите внимание, что это «поверхностная» копия, так как она копирует только атрибуты объекта, а не его ассоциации. Степень «глубокой» копии зависит от приложения и поэтому должна быть реализована приложением в соответствии с его потребностями. Метод dup не сохраняет временные метки (created|updated)_(at|on).
# File activerecord/lib/active_record/core.rb, line 254
Заполните coder атрибутами этой записи, которые должны быть сериализованы. Структура coder в этом методе гарантированно соответствует структуре coder, переданной методу init_with.
Пример:
class Post < ActiveRecord::Base
end
coder = {}
Post.new.encode_with(coder)
coder # => {"attributes" => {"id" => nil, ... }}
# File activerecord/lib/active_record/core.rb, line 286 def encode_with(coder) coder['attributes'] = attributes_for_coder end
Клонирует и замораживает хеш-таблицу атрибутов таким образом, что ассоциации по-прежнему доступны, даже для удалённых записей, но клонированные модели не будут заморожены.
# File activerecord/lib/active_record/core.rb, line 316 def freeze @attributes = @attributes.clone.freeze self end
Возвращает true если хеш-таблица атрибутов заморожена.
# File activerecord/lib/active_record/core.rb, line 322 def frozen? @attributes.frozen? end
Делегирует id, чтобы две записи одного типа и id могли работать с чем-то вроде:
[ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
# File activerecord/lib/active_record/core.rb, line 309 def hash id.hash end
Инициализирует пустой объект модели из coder. coder должен содержать атрибуты, необходимые для инициализации пустого объекта модели. Например:
class Post < ActiveRecord::Base
end
post = Post.allocate
post.init_with('attributes' => { 'title' => 'hello world' })
post.title # => 'hello world'
# File activerecord/lib/active_record/core.rb, line 211 def init_with(coder) @attributes = self.class.initialize_attributes(coder['attributes']) @column_types_override = coder['column_types'] @column_types = self.class.column_types init_internals @new_record = false self.class.define_attribute_methods run_callbacks :find run_callbacks :initialize self end
Возвращает содержимое записи в виде отформатированной строки.
# File activerecord/lib/active_record/core.rb, line 351
def inspect
# We check defined?(@attributes) not to issue warnings if the object is
# allocated but not initialized.
inspection = if defined?(@attributes) && @attributes
self.class.column_names.collect { |name|
if has_attribute?(name)
"#{name}: #{attribute_for_inspect(name)}"
end
}.compact.join(", ")
else
"not initialized"
end
"#<#{self.class} #{inspection}>"
end Помечает эту запись как только для чтения.
# File activerecord/lib/active_record/core.rb, line 342 def readonly! @readonly = true end
Возвращает true, если запись является только для чтения. Записи, загруженные через присоединения с атрибутами "piggy-back", будут помечены как только для чтения, так как их нельзя сохранить.
# File activerecord/lib/active_record/core.rb, line 337 def readonly? @readonly end
Возвращает хеш заданных методов с их именами в качестве ключей и возвращаемыми значениями в качестве значений.
# File activerecord/lib/active_record/core.rb, line 367
def slice(*methods)
Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access
end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.