Ruby on rails Rails-序列化另一个activerecord模型

Ruby on rails Rails-序列化另一个activerecord模型,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我希望将不完整/临时模型序列化为另一个模型的属性,例如: class User < ActiveRecord::Base serialize :pending_post end 但是,不是为新的Post模型保存yaml,而是pending_Post属性为nil(在DB中和重新加载时)。序列化可以很好地处理其他对象、散列、数组等,但在本例中为零。这是Rails 2.3.9,但是我用3.0.1做了一个快速测试,看到了相同的结果。我在几年前发现了对该问题的描述: 我知道我可以手动序列化/反

我希望将不完整/临时模型序列化为另一个模型的属性,例如:

class User < ActiveRecord::Base
  serialize :pending_post
end
但是,不是为新的Post模型保存yaml,而是pending_Post属性为nil(在DB中和重新加载时)。序列化可以很好地处理其他对象、散列、数组等,但在本例中为零。这是Rails 2.3.9,但是我用3.0.1做了一个快速测试,看到了相同的结果。我在几年前发现了对该问题的描述:


我知道我可以手动序列化/反序列化对象(这很好),或者只序列化post.attributes,但我很好奇是否有人知道为什么会这样做?如果新帖子在分配给user.pending_post之前保存,则仅将ID保存为user.pending_post属性。我很确定这是故意的,不是一个bug,但我不明白其中的原因。序列化活动记录模型的形式是否糟糕?

我认为需要序列化/保存属性,而不是post对象本身,如下所示:

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

我希望这有帮助

您确定挂起帖子的数据库字段设置为text(而不是varchar)吗?是的,它是一个文本字段。我也有同样的想法,尝试了text和varchar,但在这两种情况下,它们的行为似乎都是一样的。它还可以序列化非activerecord对象。是的,这是我正在探索的选项之一。你知道为什么这是必要的吗?使用yaml手动序列化/反序列化帖子似乎效果不错。为什么“serialize:attr_name”会将其与其他对象区别对待?这是一个好问题,我不知道答案。我知道只存储一个属性散列是一个简单的过程,ruby对象可能比最初看起来更复杂。例如,实例变量可以在对象的生命周期内动态创建,我不知道这样的问题是否会使事情复杂化。将ruby对象与c/c++对象进行对比,在c/c++对象中,一些快速的数学运算可以准确地告诉您每个对象在内存中占用多少字节。动态意味着复杂:)事实上,我想得越多,将ruby对象填充到文本块中就越困难,效率也就越低。如果Rails想要支持它,就必须考虑到可以动态创建实例变量和方法这一事实。安全存储ruby对象的唯一方法是存储组成该对象的所有代码。存储该方法时构成该方法的所有实例变量和方法定义。更不用说继承问题了。这似乎有点不一致(或者没有很好的文档记录?),因为“serialize:attr_name”与您创建的任何其他任意ruby对象一样工作,而不是ActiveRecord::Base子类的对象。我意识到,由于ruby对象的动态特性,您必须小心这一点,但是序列化activerecord对象时是否存在一些不适用于其他ruby对象的附加问题?serialize的文档中提到了“数组、哈希和其他不可映射的对象”。我不知道这意味着什么,但可能是指可映射到数据库(即ActiveRecord)。也许这是为了防止递归。包含ActiveRecord对象的ActiveRecord对象将真正开始降低数据库性能。如果允许您将两个对象分配给对方,那么看看会发生什么会很有趣:)
def save_post
  self.posts.create self.pending_post
end