在Rails中输出序列化对象

时间:2011-10-14 20:42:40

标签: ruby-on-rails yaml

在Rails 2.3.6中,我将一些序列化数据存储在数据库字段中。

我的数据库中的“feed_event.data”字段存储为文本,并且(例如)等于:

{:post=>{:pic=>"http://s3.amazonaws.com/criticalcity/datas/3524/big_thumb/send-a-letter.jpg", :name=>"Un’istruzione perfetta", :id=>1995, :authors=>"Delilah"}, :user=>{:pic=>"http://s3.amazonaws.com/criticalcity/avatars/537/thumb/DSCN2744.JPG", :name=>"Luci!", :id=>537}}

现在我需要将此字段输出为字符串(与数据库中的完全相同),但是当我问:

puts feed_event.data

输出:

postpichttp://s3.amazonaws.com/criticalcity/datas/3524/big_thumb/send-a-letter.jpgnameUn’istruzione perfettaid1995authorsDelilahuserpichttp://s3.amazonaws.com/criticalcity/avatars/537/thumb/DSCN2744.JPGnameLuci!

为什么呢? 如何将其输出为yaml字符串?

更新

为了创建它,我在FeedEvent模型中有这个:

class FeedEvent < ActiveRecord::Base
   has_many :user_feed_events, :dependent => :destroy
   has_many :users, :through => :user_feed_events

   serialize :data

 end

为了创建一个新的FeedEvent元素,我做了:

feed = FeedEvent.create(:event_type => "comment #{commentable_type}", :type_id => id, :data => {:user => {:id => user.id, :name => user.name, :pic => user.avatar.url(:thumb)}, :comment => {:id => id, :body => body, :commentable_id => commentable_id, :commentable_type => :commentable_type, :commentable_name => commentable.name}}) 

更新#2

在nzifnab的提示之后我使用了.to_yaml方法,但在这种情况下Rails的输出是:

data: "--- \n:post: \n  :pic: http://s3.amazonaws.com/criticalcity/datas/3524/big_thumb/send-a-letter.jpg\n  :authors: Delilah\n  :name: \"Un\\xE2\\x80\\x99istruzione perfetta\"\n  :id: 1995\n:user: \n  :pic: http://s3.amazonaws.com/criticalcity/avatars/537/thumb/DSCN2744.JPG\n  :name: Luci!\n  :id: 537\n"

同样在模型中注释“serialize:data”输出相同的内容。

谢谢, 奥古斯托

3 个答案:

答案 0 :(得分:0)

默认情况下,序列化是在哈希中进行的。

只需循环显示它的内容:

<% feed_event.data.each do |key, value| %>
  <%= "#{key}: #{value}" %>
<% end %>

我只是不确定这里的筑巢水平,但你已经有了这个想法。

答案 1 :(得分:0)

当您致电feed_data.data时,rails已自动对您的字符串进行反序列化。你可以这样打印出来:

feed_data.data.inspect将ruby哈希表示形式作为字符串,但由于它已经反序列化,你还需要做其他事吗?

您可以像feed_data.data[:post][:pic]

一样调用其中的所有内容

我不确定您可以使用什么方法从记录中获取原始序列化字符串,但通常您不需要。

答案 2 :(得分:0)

正如您在更新中提到的,正确的方法是在您的模型中添加“serialize:data”。

然后,您可以将数据属性作为哈希值访问,这是默认值,并在保存对象时自动保留。

重要提示:

这项工作的一个重要方面是您将数据库字段定义为文本或字符串 - 而不是二进制字段 - 否则这将无法正常工作!