ActiveRecord serialize属性不作为'hash'返回,而是作为字符串返回

时间:2013-12-19 08:33:37

标签: ruby-on-rails ruby activerecord

我有桌子/班级:

class User < ActiveRecord::Base
    serialize :photos
end

当我通过以下方式查询时:

Post.joins(:user).select('users.username, users.photo AS user_photo')

这会返回照片,但不是“散列”,而是存储在数据库中的原始字符串:

{
    "post_type" = 0;
    "user_id" = 1;
    "user_photo" = "---\n:photo: http://res.cloudinary.com/jhess2991/image/upload/eb29c343249624.png\n:thumb: http://res.cloudinary.com/jhess2991/image/upload/c_scale,h_180,w_180/eb29c3423429624.png\n";
    username = HDILOfficial;
}

当然,只有当我从ActiveRecord以外的User类进行查询时才会发生这种情况。如果我从UserUser.select(blah blah blah))查询,则它将作为普通哈希返回。

所以我的问题是,在从另一个班级查询时,如何将'photo'视为哈希?

2 个答案:

答案 0 :(得分:0)

目前,你不能。 ActiveRecord无法知道user_photo引用您在用户模型中定义的photos属性的值。

答案 1 :(得分:-1)

你有没有看到api.rubyonrails.org的信息

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Saving+arrays%2C+hashes%2C+and+other+non-mappable+objects+in+text+columns

在文本列中保存数组,散列和其他不可映射的对象

Active Record可以使用YAML序列化文本列中的任何对象。为此,您必须通过调用类方法serialize来指定它。这使得存储数组,散列和其他不可映射的对象成为可能,而无需进行任何额外的工作。

class User < ActiveRecord::Base
  serialize :preferences
end

user = User.create(preferences: { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }

您还可以指定一个类选项作为第二个参数,如果将序列化对象检索为不在层次结构中的类的后代,则该选项将引发异常。

class User < ActiveRecord::Base
  serialize :preferences, Hash
end

user = User.create(preferences: %w( one two three ))
User.find(user.id).preferences    # raises SerializationTypeMismatch

指定类选项时,该属性的默认值将是该类的新实例。

class User < ActiveRecord::Base
  serialize :preferences, OpenStruct
end

user = User.new
user.preferences.theme_color = "red"

这可能会有所帮助