2013-08-22 1 views
2

Итак, вот забавный. У меня есть метод контроллера, который возвращает список «возобновляемых» объектов на основе некоторых правил. Но есть критерии, которые я не могу включить в один запрос базы данных - поэтому я бы хотел отобразить «базовый» возобновляемый список, а затем по существу запустить фильтр на нем до возвращения к клиенту.Rails Active Model Serializer - нужно манипулировать рендерингом json перед отправкой

Другими словами, то, что я пытаюсь сделать, это:

sessions = ended_sessions.where("current_date <= (created_at + interval '12 hours')") 

json = JSON.parse(SessionResumeSerializer.new(sessions).as_json) 

json.each do |session| 
# additional processing 
end 

Во всяком случае, SessionResumeSerializer.new(sessions).as_json полностью не работает, бросая: ошибка

NoMethodError: undefined method 'read_attribute_for_serialization' for <ActiveRecord::Relation:0x007ffa164b0ce0>.

Я явно смущен тем, как это должно работать - кажется совершенно интуитивным, что инициализатор примет отношение и отобразит его.

Есть ли лучший способ сделать это?

ответ

1

Проблема в том, что ваша переменная «сеансы» относится к массиву, а не к объекту сеанса. Что вы делаете, работали бы отлично для одного сеанса (класса SessionResume), но для массива вы должны сделать что-то вроде следующего:

sessions = ended_sessions.where("current_date <= (created_at + interval '12 hours')") 
json  = JSON.parse(ActiveModel::ArraySerializer.new(sessions).as_json) 

json.each do |session| 
    # additional processing 
end 

Обратите внимание, что вам нужно использовать ActiveModel :: ArraySerializer довольно чем специфический для класса, сериализатор с одним объектом.

+0

Мне это нравится - большое решение! В итоге я немного изменил направление и зациклился на отношении сеансов, сделал свою обработку в точке THAT, а затем добавил к массиву сериализаторов с одним объектом, которые затем возвращаются. Отлично работает и сохраняет фактическую сериализацию json позже в этом процессе, как и должно быть. Давать вам ответ так или иначе, как он бы тоже работал. спасибо – MBHNYC