модуль ActiveRecord::AttributeMethods::Serialization::ClassMethods
Публичные методы экземпляров
# File activerecord/lib/active_record/attribute_methods/serialization.rb, line 60
def serialize(attr_name, class_name_or_coder = Object)
# 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, :serialize) do |type|
if type_incompatible_with_serialize?(type, class_name_or_coder)
raise ColumnNotSerializableError.new(attr_name, type)
end
Type::Serialized.new(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или имя класса, которому должен соответствовать тип объекта.
Пример
# 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–2018 David Heinemeier Hansson
Licensed under the MIT License.