在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”输出相同的内容。
谢谢, 奥古斯托
答案 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”。
然后,您可以将数据属性作为哈希值访问,这是默认值,并在保存对象时自动保留。
重要提示:
这项工作的一个重要方面是您将数据库字段定义为文本或字符串 - 而不是二进制字段 - 否则这将无法正常工作!