newbie: добавить сериализованные целые числа в столбец базы данных и вернуть их обратно - PullRequest
1 голос
/ 28 февраля 2012

Как я могу хранить целые числа (идентификаторы пользователя от 1 до 9999), сериализованные в столбце базы данных, и извлекать их обратно?

В моей модели пользователя у меня есть столбец приглашений,

User model
serialize: invites
invites = text field

Теперь я пытаюсь сделать 2 вещи:

  • Добавить целое число user_id (от 1 до 9999), сериализованное в столбце "invites"
  • Получить все идентификаторы пользователя обратно изстолбец User.invited (десериализовать его?)

1 Ответ

2 голосов
/ 28 февраля 2012

Из тонкого руководства :

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 =>) справиться с этой ситуацией.

...