Как добавить атрибуты в визуализированный JSON из отношений без вложенности? - PullRequest
1 голос
/ 25 мая 2011

Вот проблема: я использую активную запись и возвращаю некоторые фотообъекты. Конечным потребителем этих фотообъектов станет мобильное приложение.

В ответе должны быть возвращены миниатюрные версии. Разработчик мобильного приложения запросил, чтобы возвращаемый 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_600":'image_600.jpg',
  "image_vga":'image_VGA.jpg',
  "image_full":'image.jpg'
 }
}

На данный момент самый простой способ - создать столбцы для каждой из миниатюр и ничего себе. Хотя я не люблю, когда меня вовлекают в это, потому что если бы мы хотели использовать разные миниатюры позже, это означало бы добавление столбцов в БД и т. Д. Я бы предпочел либо просто указать миниатюры в классе модели, либо иметь отдельную таблицу для миниатюр с одним большой палец на строку таблицы.

Я смотрел на делегат, составленный_, используя GROUP_CONCAT в соединении .., используя: method => в to_json .. ни один из этих вариантов не похож на параметры. Есть ли простой способ сделать это?

Пример базовой модели:

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

Пока результат выглядит следующим образом на основе ответа Джесси Рейсса

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

1 Ответ

10 голосов
/ 25 мая 2011

Вы можете настроить сериализацию json объекта довольно просто, используя метод as_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

Вам не нужно полагаться на супер упрощенные методы сериализации json в ActiveRecord.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...