如何解决如何在不嵌套的情况下从关系中向渲染的JSON添加属性?
| 问题出在这里:我正在使用活动记录并返回一些照片对象。这些照片对象的最终消费者将是移动应用程序。 响应需要返回缩略图版本,移动开发人员已要求返回的JSON如下所示。{
\"root_url\":\'http://place.s3.amazonaws.com/folder/\',\"image_300\":\'image_300.jpg\',\"image_600\":\'image_600.jpg\',\"image_vga\":\'image_VGA.jpg\',\"image_full\":\'image.jpg\'
}
而不是这样:
{
\"root_url\":\'http://place.s3.amazonaws.com/folder/\',\"thumbnails\": {
\"image_300\":\'image_300.jpg\',\"image_full\":\'image.jpg\'
}
}
到目前为止,最简单的方法是为每个缩略图创建列,然后哇!我不喜欢被限制在其中,因为如果以后我们想要不同的缩略图,那就意味着向数据库中添加列,等等。我更愿意要么只是在模型类中指定缩略图,要么用一个单独的表来包含缩略图桌子的每一行一个大拇指。
我已经看过委托,committed_of,在联接中使用GROUP_CONCAT ..,在to_json中使用:method => ..这些都不是选项。是否有捷径可寻?
基本模型示例:
class Photo < ActiveRecord::Base
has_many :thumbnails,:as => :thumbs_for #polymorphic
end
class Thumbnail < ActiveRecord::Base
# columns = name,filename
belongs_to :thumb_for,:polymorphic => true
end
到目前为止,根据jesse reiss的回答,结果看起来像这样
def as_json(options)
options ||= {} #even if you provide a default,it ends up as nil
hash = super(options.merge({:include => :thumbnails}))
if thumbs = hash.delete(:thumbnails)
thumbs.each {|t| hash.merge!({t[\'name\']=>t[\'filename\']})}
end
hash
end
解决方法
您可以使用
as_json
方法非常简单地自定义对象的json序列化。
为此,您可以执行以下操作:
def as_json(*args)
hash = super(*args)
hash.merge!(hash.delete(\"thumbnails\"))
end
或者你可以超级手动地做
def as_json(*args)
hash = super()
thumbnails.each do |thumb|
# build thumbnail json
end
end
您不必依赖ActiveRecord的超级简单化json序列化方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。