我有桌子/班级:
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
类进行查询时才会发生这种情况。如果我从User
(User.select(blah blah blah)
)查询,则它将作为普通哈希返回。
所以我的问题是,在从另一个班级查询时,如何将'photo'视为哈希?
答案 0 :(得分:0)
目前,你不能。 ActiveRecord无法知道user_photo
引用您在用户模型中定义的photos
属性的值。
答案 1 :(得分:-1)
你有没有看到api.rubyonrails.org的信息
在文本列中保存数组,散列和其他不可映射的对象
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"
这可能会有所帮助