微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不嵌套的情况下从关系中向渲染的JSON添加属性?

如何解决如何在不嵌套的情况下从关系中向渲染的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 举报,一经查实,本站将立刻删除。