Spec-Zone.ru › Ruby on Rails 5.0

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

Открытые методы экземпляров

serialize(attr_name, class_name_or_coder = Object) Показать исходный код
# File activerecord/lib/active_record/attribute_methods/serialization.rb, line 48
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(class_name_or_coder)
          end

  decorate_attribute_type(attr_name, :serialize) do |type|
    Type::Serialized.new(type, coder)
  end
end

Если у вас есть атрибут, который необходимо сохранить в базе данных как объект и извлечь как тот же объект, укажите имя этого атрибута с помощью этого метода, и он будет обрабатываться автоматически. Сериализация выполняется с помощью YAML. Если class_name указан, сериализованный объект должен быть этого класса при присвоении и извлечении. В противном случае будет поднято исключение SerializationTypeMismatch.

Пустые объекты в качестве {}, в случае Hash, или [], в случае Array, всегда будут сохраняться как null.

Помните, что адаптеры баз данных обрабатывают определенные задачи сериализации за вас. Например: json и jsonb типы в PostgreSQL будут прозрачно преобразовываться между синтаксисом JSON-объекта/массива и объектами 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.

Spec-Zone.ru

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