Spec-Zone.ru › Ruby on Rails 6.1

модуль ActiveRecord::AttributeMethods::Serialization::ClassMethods

Публичные методы экземпляров

serialize(attr_name, class_name_or_coder = Object, **options) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API