2011-10-14 34 views
0

在Rails 2.3.6中我将一些序列化数据存储在数据库字段中。在Rails中输出序列化对象

在我的数据库我的“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字符串?

UPDATE

为了创建它,我有这个在我的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" 

兼评“连载:数据”模型输出。

感谢, 奥古斯托

+0

你如何序列化它?哈希,数组,其他吗? – apneadiving

+0

我更新了这个问题的一些细节。 – Augusto

+0

回应您的最新更新。这不是你想要的价值吗?这不就是存储在数据库中的确切字符串吗?如果你打开了一个MySql控制台会话并做了'SELECT data FROM feed_events WHERE data IS NOT NULL LIMIT 1',那么保存的字符串是不是像这样?让我知道如果你正在寻找其他东西... – nzifnab

回答

0

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

feed_data.data.inspect获得红宝石哈希表示作为一个字符串,但由于它已经被反序列化它,你需要做任何事情吗?

你可以调用像feed_data.data[:post][:pic]

上它的一切,我不知道你可以用什么方法来抓住从记录的原始序列化的字符串,但通常你不需要。

+0

我试图输出整个表作为创建语句的系列,以便将表从mysql导出到mongodb。我会尝试引入方法,看看它是否 – Augusto

+0

在这种情况下,可以使用'feed_data.data.to_yaml'或者在生成CREATE语句时临时删除模型中的'serialize:data'行,这样调用'feed_data.data'会给你原始的存储值,请记住在之后添加'serialize'回复。 – nzifnab

+0

感谢nzifnab,几乎在那里,但仍然无法正常工作,我用一些新的细节更新了这个问题。 – Augusto

0

默认情况下,系列化是一个Hash制造。

简单的循环它来显示它的内容:

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

我只是不能确定这里嵌套级别,但你有这个想法。

+0

Mhhh ..不知道这是否会工作,因为嵌套级别因行而异...... – Augusto

+0

我明白了,所以您应该创建一个递归助手来检查它是否处理字符串或散列。明确? – apneadiving

+0

我不知道该怎么做:( – Augusto

0

正如您在更新中提到的那样,正确的方法是将“serialize:data”放入模型中。

然后,您可以将数据属性作为散列来访问,这是默认值,当您保存对象时它会自动保留。

重要提示:

对于这项工作的一个重要的事情是你定义的数据库字段为文本或字符串 - 不是二进制领域 - 否则将无法正常工作!