2017-01-06 4 views
0

У меня есть текстовое поле в базе данных MySQL, который я использую ActiveRecord сериализовать как хэш:Сериализации существующей строки в базе данных с ActiveRecord

class Record < ActiveRecord::Base 
    serialize :mail_validation, Hash 
end 

Когда я сохранить объекты ActiveRecord в базу данных, что текстовое поле правильно сериализован и сохранен. Когда я вызываю этот атрибут, Rails корректно преобразует его в хэш.

поле в базе данных выглядит следующим образом:

mail_validation: --- 
:metadata: 
    :county_name: Bucks 

Однако, у меня есть существующие записи в базе данных, по-видимому, не сериализуются. Это выглядит следующим образом:

mail_validation: { deliverable: "N", plus4_of_zip: "1335", process_flag: "P", delivery_point: "20", cass_date: "2014-11-04" } 

Когда я пытаюсь вызвать атрибут mail_validation этой записи, он возвращает результат в виде строки, а не хэш. (Записи, возвращающие строку для этого атрибута, были импортированы из старой базы данных).

Как я могу обеспечить, чтобы все записи возвращали хэш, когда я вызываю этот атрибут?

+0

Что написал "унаследованных" записи? Это похоже на сырой JavaScript (т. Е. Сломанная попытка JSON). Во всяком случае, я думаю, что вы застряли, делая это с трудом: прочитайте данные, проанализируйте их в хеш-рубине, конвертируйте их в YAML и запишите все это время, не используя свой класс 'Record'. –

ответ

0

Выполнить этот скрипт:

records = Record.where("mail_validation NOT LIKE '---%'") # all string values 
records.each do |record| 
    # remove braces 
    mail_validation = record.mail_validation.gsub(/(\{ | \})/, '') 
    # split on key-value pairs 
    mail_validation = mail_validation.split(', ') 
    # make hash 
    mail_validation = mail_validation.map { |pair| pair.split(': ') }.to_h 
    # hack to avoid ActiveRecord::SerializationTypeMismatch error 
    Record.where(id: record.id).update_all(mail_validation: mail_validation) 
end