Из тонкого руководства :
serialize (attr_name, class_name = Object)
Если у вас есть атрибут, который требуетДля сохранения в базе данных в качестве объекта и извлечения в качестве того же объекта, затем укажите имя этого атрибута, используя этот метод, и он будет обработан автоматически.Сериализация осуществляется через YAML.Если указано class_name
, сериализованный объект должен иметь этот класс при извлечении, иначе будет вызвано SerializationTypeMismatch
.
Итак, если вы хотите сохранить массив целых чисел как сериализованный объект,затем:
class User < ActiveRecord::Base
serialize :invites, Array
#...
end
Вы бы хотели, чтобы столбец invites
был столбцом text
в базе данных (не string
!), чтобы избежать проблем с размером.
Тогда вы можете рассматривать user.invites
как простой массив:
user.invites = [ 1, 2, 3 ]
user.invites.push(11)
Это, конечно, не подтверждает, что числа действительны или у вас нет дубликатов (но вы можете использовать Установите для этого вместо массива), это также не помешает вам вставить туда строку.
Я не рекомендую вам делать это, хотя сериализация почти всегда является ошибкой,вернусь, чтобы укусить вас позже.Сериализованный столбец - это непрозрачный блок данных в отношении базы данных: вы не можете обновить его на месте, вы не можете запросить его, все, что вы можете сделать, это вытащить его из базы данных и вернуть обратно.serialize
использует YAML для сериализации, и это ужасный формат, если вам нужно работать с сериализованными данными в базе данных;Вы также можете столкнуться с интересными проблемами кодирования во время обновлений.
Вам лучше настроить традиционную таблицу связей и отдельную модель (возможно, используя has_many ... :through =>
) справиться с этой ситуацией.