модуль ActiveRecord::AttributeMethods::Serialization::ClassMethods
Публичные методы экземпляров
# File activerecord/lib/active_record/attribute_methods/serialization.rb, line 66
def serialize(attr_name, class_name_or_coder = Object, **options)
# When ::JSON is used, force it to go through the Active Support JSON encoder
# to ensure special objects (e.g. Active Record models) are dumped correctly
# using the #as_json hook.
coder = if class_name_or_coder == ::JSON
Coders::JSON
elsif [:load, :dump].all? { |x| class_name_or_coder.respond_to?(x) }
class_name_or_coder
else
Coders::YAMLColumn.new(attr_name, class_name_or_coder)
end
decorate_attribute_type(attr_name.to_s, **options) do |cast_type|
if type_incompatible_with_serialize?(cast_type, class_name_or_coder)
raise ColumnNotSerializableError.new(attr_name, cast_type)
end
Type::Serialized.new(cast_type, coder)
end
end Если у вас есть атрибут, который необходимо сохранить в базе данных как объект, и извлечь как тот же объект, укажите имя этого атрибута с помощью этого метода, и он будет обрабатываться автоматически. Сериализация выполняется с помощью YAML. Если class_name указано, сериализованный объект должен быть этого класса при присвоении и извлечении. В противном случае будет поднято SerializationTypeMismatch.
Пустые объекты, как {}, в случае Hash, или [], в случае Array, всегда будут сохранены как null.
Помните, что адаптеры баз данных обрабатывают определенные задачи сериализации за вас. Например: json и jsonb типы в PostgreSQL будут преобразовываться между синтаксисом JSON object/array и Ruby Hash или Array объектами прозрачно. В этом случае нет необходимости использовать serialize.
Для более сложных случаев, таких как преобразование в или из объектов вашей предметной области, рассмотрите использование API ActiveRecord::Attributes.
Параметры
-
attr_name- Имя поля, которое должно быть сериализовано. -
class_name_or_coder- Необязательно, объект кодера, который отвечает на.loadи.dump, или имя класса, которому должен соответствовать тип объекта.
Параметры
default Значение по умолчанию, которое следует использовать, когда значение не указано. Если этот параметр не передан, будет использоваться предыдущее значение по умолчанию (если таковое имеется). В противном случае значение по умолчанию будет nil.
Пример
# Serialize a preferences attribute. class User < ActiveRecord::Base serialize :preferences end # Serialize preferences using JSON as coder. class User < ActiveRecord::Base serialize :preferences, JSON end # Serialize preferences as Hash using YAML coder. class User < ActiveRecord::Base serialize :preferences, Hash end
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.