Rails Seralized My Object One Way & отказывается меняться - PullRequest
1 голос
/ 26 февраля 2010

У меня есть класс rails, который сериализует один атрибут.

Статистика класса

serialize: список пользователей

конец

Когда статистический объект загружается и его список пользователей изменяется со строки на список пользователей массива, он всегда сериализуется обратно в строку. Платформа, кажется, запоминает и десериализует: список пользователей в строку, даже если он входит как массив.

>> s = Statistic.find 238
=> #<Statistic id: 238, userlist: "--- \n- 2222437\n- \"99779\"\n- \"120429\"\n- \"210503\"\n- 32...">
# Note here: :userlist is an Array in YAML. Why doesn't it get correctly deserialized?

>> s.userlist.class
=> String
>> s.userlist = s.userlist.split(/\s+/)

>> s.userlist.class
=> Array

>> s.save
=> true

>> s.reload
=> #<Statistic id: 238,userlist: "--- \n- 2222437\n- \"99779\"\n- \"120429\"\n- \"210503\"\n- 32...">

>> s.userlist.class
=> String

Цель этого упражнения - преобразовать все списки пользователей String в Array. Если я меняю класс ( serialize: userlist, Array ) перед преобразованием, я получаю исключения TypeMismatch.

ActiveRecord :: SerializationTypeMismatch: список пользователей должен был быть массивом, но был строкой

Есть ли способ заставить AR интерпретировать список пользователей как массив?

% rails --version
Rails 2.3.4

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

Нашел проблему. Неверная строка YAML:

>> YAML::load(s.userlist)
ArgumentError: syntax error:ScannerException while scanning a quoted scalar we had this found unexpected end of stream
        from (irb):8

Код от AR :: B:

      def object_from_yaml(string)
        return string unless string.is_a?(String) && string =~ /^---/
        YAML::load(string) rescue string
      end

Некоторые данные были длиннее 65 535 символов и переполняли текстовый столбец mysql.

1 голос
/ 26 февраля 2010

Есть ли конкретная причина, по которой вы не используете для этого регулярную связь?

Чтобы ответить на вопрос, IIRC вы можете передать class_name для сериализации.

serialize :userlist, :class_name => 'Array'

В качестве альтернативы попробуйте:

serialize :userlist, Array

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...