Вывод сериализованного объекта в Rails - PullRequest
0 голосов
/ 15 октября 2011

В 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}}) 

UPDATE # 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 голосов
/ 15 октября 2011

Когда вы звоните feed_data.data rails автоматически десериализовал вашу строку.Вы можете распечатать его так:

feed_data.data.inspect, чтобы получить хэш-представление ruby ​​в виде строки, но, поскольку он уже десериализован, вам нужно сделать что-нибудь еще?

вы можете вызывать все что угодно, например feed_data.data[:post][:pic]

Я не уверен, какой метод вы можете использовать, чтобы извлечь необработанную сериализованную строку из записи, но обычно вам не нужно.

0 голосов
/ 15 октября 2011

Как вы упомянули в своем обновлении, правильный способ сделать это - добавить в сериализацию "serialize: data".

Затем вы можете получить доступ к атрибуту данных в виде хэша, это по умолчанию,и он автоматически сохраняется при сохранении объекта.

Важное примечание:

Для этого важно, чтобы вы определили поле базы данных как текст или строку- не как двоичное поле - иначе это не будет работать правильно!

0 голосов
/ 15 октября 2011

По умолчанию сериализация выполняется в хэше.

Просто зациклите его, чтобы отобразить его содержимое:

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

Я просто не уверен насчет уровня вложенности, но у вас есть идея.

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