У меня есть строковое поле data в модели SerializeTest, и я хочу сохранить в нем представление JSON другой модели ActiveRecord. Что бы я ни делал, он сохраняет NULL в базу данных.
Тот же код работает, когда SerializeableObject является простым объектом, а не потомком ActiveRecord::Base.
class SerializeTest < ActiveRecord::Base
serialize :data, SerializeableObject
end
class SerializeableObject < ActiveRecord::Base
class << self
def load(data)
new JSON.load(data)
end
def dump(obj)
obj.to_json
end
end
end
Вот как это воспроизвести
s = SerializeTest.new
s.data.foo = 'test'
s.save
s.reload
s.data.foo # should be 'test' but equals nil
Миграции
class CreateSerializeTests < ActiveRecord::Migration
def change
create_table :serialize_tests do |t|
t.string :data
end
end
end
class CreateSerializeableObjects < ActiveRecord::Migration
def change
create_table :serializeable_objects do |t|
t.string :foo
end
end
end
Любые идеи, как это исправить?
P.S. Он отлично работал в Rails 3, но не работает в Rails 4.
Я использую 4.2.10
@MrShemek Я отправил свой проект с инструкциями по воспроизведению в файле readme github.com/luckyjazzbo/rails4-serialize-пример
похоже, что SerializeableObject нужно сначала сохранить в БД. После этого, когда он «прикрепится», вы сможете его модифицировать (s.data.foo = 'test 2'). При сохранении основного объекта (s) атрибут данных будет обновлен, а SerializeableObject (сохранение в БД) останется прежним. Однако я до сих пор не знаю, почему это происходит.
это мало помогает.. весь смысл этого поля в хранении данных еще не готовых объектов
Я протестировал ваш код с разными версиями Rails, и он выглядит как ошибка в Rails, исправленная в версии 5.0.0.





Какую версию Rails вы используете? С 4.0.0 и базовой настройкой все работает как положено (
#<SerializeTest id: 1, data: #<SerializeableObject id: nil, foo: "test">>)