2012-05-22 30 views
1

由于某些原因,无论何时从控制台访问序列化属性,都会将其视为普通字符串。序列化/反序列化在没有从控制台访问时(例如从视图中)工作正常。我的代码如下:Rails - 从控制台访问序列化数据

class Foo < ActiveRecord::Base 
    belongs_to :user 
    serialize :serialized_data # column type is text 
    ... 
end 

例如,如果我把在app/views/users/show.html.erb如下:

<%= @user.foo.serialized_data.first %> 

这将正确打印出第一组数据。当我从控制台运行以下命令:

> User.first.foo.serialized_data.first 

它只会打印出-,这是一个YAML文件的第一个字符。此外,User.first.foo.serialized_data将打印出一个大的字符串,而不是最初保存的数组/散列。

更新:
如果我生成:serialized_data中的数据并尝试在同一控制台会话中访问它,它似乎工作正常。一旦我关闭控制台,然后重新输入它,就会出现问题。

编辑:
为了清楚起见,:serialized_data是散列的以下形式的数组:

[{"stuff" => {"name" => name, "qty" => 1}}, {"stuff" => {"name" => name2, "qty" => 3}}] 

并且可以如这样进行访问:

user.foo.serialized_data[0]["stuff"]["qty"] 
=> 1 

编辑2:
它可以同样重要的是要注意我在我的散列中存储模型对象。正如在下面的评论中提到的,如果我们要使用我给出的示例,user.foo.serialized_data[0]["stuff"]["name"]将返回具有属性的模型Name的对象。所以,我可以运行user.foo.serialize_data[0]["stuff"]["name"].id等等。也许这个对象正在搞乱YAML文件的语法。

+0

什么是你正在序列化的数据?我曾参与过的一个应用程序涉及序列化哈希。然后这个散列作为一个散列回来了,我可以像'@ combat_instance.entities.first [1] .attack_damage'那样执行一些操作,其中实体就是序列化的数据。我使用1,因为散列中每个数组的零索引是一个id。所以如果你想序列化别的不只是一个散列,调整设置serialized_data值的方法。 – agmcleod

+0

如果您第二次在控制台中运行access':serialized_data',会发生什么情况? –

+0

@agmcleod - 在散列中,我序列化一个对象。使用我的问题的例子,'user.foo.serialized_data [0] [“stuff”] [“name”]'实际上会返回模型Name的对象。我已经更新了我的问题。 – Nick

回答

0

问题是我正在存储哈希值中的整个对象,如编辑2中所述。切换到对象id解决了此问题。

相关问题