модуль ActiveRecord::Core
Публичные методы класса
# File activerecord/lib/active_record/core.rb, line 51 def self.configurations @@configurations end
Возвращает полностью разрешённый хеш конфигураций
# File activerecord/lib/active_record/core.rb, line 45 def self.configurations=(config) @@configurations = ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve end
Содержит конфигурацию базы данных — как обычно хранится в 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 100 def self.connection_handler ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler end
# File activerecord/lib/active_record/core.rb, line 104 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.
".squish)
end # File activerecord/lib/active_record/core.rb, line 272
def initialize(attributes = nil, options = {})
@attributes = self.class._default_attributes.dup
self.class.define_attribute_methods
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_initialize_callbacks
end Новые объекты могут быть созданы либо пустыми (не передавать параметры), либо предварительно заполненными атрибутами, но еще не сохраненными (передать хеш с именами ключей, соответствующими именам столбцов связанной таблицы). В обоих случаях допустимые ключи атрибутов определяются именами столбцов связанной таблицы — следовательно, у вас не может быть атрибутов, которые не являются частью столбцов таблицы.
Пример:
# Instantiates a single new object User.new(first_name: 'Jamie')
Методы публичного экземпляра
# File activerecord/lib/active_record/core.rb, line 420
def <=>(other_object)
if other_object.is_a?(self.class)
self.to_key <=> other_object.to_key
else
super
end
end Позволяет сортировать объекты
# File activerecord/lib/active_record/core.rb, line 388
def ==(comparison_object)
super ||
comparison_object.instance_of?(self.class) &&
!id.nil? &&
comparison_object.id == id
end Возвращает true, если comparison_object — это тот же самый объект, или comparison_object относится к тому же типу и self имеет идентификатор, равный comparison_object.id.
Обратите внимание, что новые записи по определению отличаются от других записей, если только другая запись не является самим получателем. Кроме того, если вы загружаете существующие записи с select и опускаете идентификатор, вы действуете на свой страх и риск; этот предикат вернёт false.
Также обратите внимание, что удаление записи сохраняет её идентификатор в экземпляре модели, поэтому удалённые модели по-прежнему сравнимы.
# File activerecord/lib/active_record/core.rb, line 334
Идентично методу 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 439 def connection_handler self.class.connection_handler end
# File activerecord/lib/active_record/core.rb, line 343
Дублированные объекты не имеют присвоенного идентификатора и рассматриваются как новые записи. Обратите внимание, что это «поверхностная» копия, поскольку она копирует только атрибуты объекта, а не его ассоциации. Степень «глубокой» копии зависит от приложения и поэтому оставляется на усмотрение приложения для реализации в соответствии с его потребностями. Метод dup не сохраняет отметки времени (created|updated)_(at|on).
# File activerecord/lib/active_record/core.rb, line 371 def encode_with(coder) # FIXME: Remove this when we better serialize attributes coder['raw_attributes'] = attributes_before_type_cast coder['attributes'] = @attributes coder['new_record'] = new_record? coder['active_record_yaml_version'] = 0 end
Заполните 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 409 def freeze @attributes = @attributes.clone.freeze self end
Клонирует и замораживает хэш атрибутов, чтобы ассоциации оставались доступными, даже при удалённых записях, но клонированные модели не будут заморожены.
# File activerecord/lib/active_record/core.rb, line 415 def frozen? @attributes.frozen? end
Возвращает true, если хэш атрибутов заморожен.
# File activerecord/lib/active_record/core.rb, line 398
def hash
if id
id.hash
else
super
end
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 301 def init_with(coder) coder = LegacyYamlAdapter.convert(self.class, coder) @attributes = coder['attributes'] init_internals @new_record = coder['new_record'] self.class.define_attribute_methods _run_find_callbacks _run_initialize_callbacks self end
Инициализирует пустой объект модели из coder. coder должен быть результатом предыдущего кодирования модели Active Record с помощью `encode_with`.
class Post < ActiveRecord::Base
end
old_post = Post.new(title: "hello world")
coder = {}
old_post.encode_with(coder)
post = Post.allocate
post.init_with(coder)
post.title # => 'hello world'
# File activerecord/lib/active_record/core.rb, line 444
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 461
def pretty_print(pp)
return super if custom_inspect_method_defined?
pp.object_address_group(self) do
if defined?(@attributes) && @attributes
column_names = self.class.column_names.select { |name| has_attribute?(name) || new_record? }
pp.seplist(column_names, proc { pp.text ',' }) do |column_name|
column_value = read_attribute(column_name)
pp.breakable ' '
pp.group(1) do
pp.text column_name
pp.text ':'
pp.breakable
pp.pp column_value
end
end
else
pp.breakable ' '
pp.text 'not initialized'
end
end
end Принимает PP и красиво выводит эту запись в него, позволяя получить хороший результат из `pp record`, когда требуется pp.
# File activerecord/lib/active_record/core.rb, line 435 def readonly! @readonly = true end
Отмечает эту запись как только для чтения.
# File activerecord/lib/active_record/core.rb, line 430 def readonly? @readonly end
Возвращает true, если запись только для чтения. Записи, загруженные через соединения с атрибутами «на подносе», будут помечены как только для чтения, так как их нельзя сохранить.
# File activerecord/lib/active_record/core.rb, line 484
def slice(*methods)
Hash[methods.map! { |method| [method, public_send(method)] }].with_indifferent_access
end Возвращает хэш заданных методов с их именами в качестве ключей и возвращаемыми значениями в качестве значений.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.