Rails - сериализация другой модели activerecord - PullRequest
1 голос
/ 26 октября 2010

Я хочу сериализовать неполную / временную модель как атрибут другой модели, такой как:

class User < ActiveRecord::Base
  serialize :pending_post
end

Где pending_post назначается модель активной записи:

...
user.pending_post = Post.new(:title => "Whatever", :message => "whatever")
user.save

Новместо сохранения yaml для новой модели Post атрибут pending_post имеет значение nil (в БД и при перезагрузке).Сериализация прекрасно работает с другими объектами, хэшами, массивами и т. Д., Но в этом случае она равна нулю.Это Rails 2.3.9, но я провел быстрый тест с 3.0.1 и увидел те же результаты.Я нашел это описание проблемы лет назад: http://www.ruby -forum.com / topic / 101858 .

Я знаю, что мог бы вручную сериализовать / десериализовать объект (который работает нормально) или сериализовать только post.attributes, но мне интересно, если кто-нибудь знает, почему это действует так, как это?Похоже, что если новое сообщение будет сохранено до того, как оно будет присвоено user.pending_post, то в качестве атрибута user.pending_post сохраняется только идентификатор.Я уверен, что это преднамеренно, а не ошибка, но я совершенно не понимаю причины.Это плохая форма для сериализации модели active_record?

1 Ответ

2 голосов
/ 26 октября 2010

Я думаю, вам нужно сериализовать / сохранить атрибуты , а не сам объект публикации, например:

user.pending_post = {:title => 'Whatever', :message => 'whatever'}
user.save

Затем вы можете превратить его в настоящий пост:

user.posts.create user.pending_post

И, вероятно, я бы сделал еще один шаг (как я часто это делаю) с помощью пользовательского метода:

def save_post
  self.posts.create self.pending_post
end

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

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