Вот проблема: я использую активную запись и возвращаю некоторые фотообъекты. Конечным потребителем этих фотообъектов станет мобильное приложение.
В ответе должны быть возвращены миниатюрные версии. Разработчик мобильного приложения запросил, чтобы возвращаемый 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