Rails Active Model Serializer - 需要在发送之前操纵渲染的json

时间:2013-08-22 17:30:40

标签: ruby-on-rails json active-model-serializers

所以这是一个有趣的 - 我有一个控制器方法,它返回一个基于一些规则的“可恢复”对象列表。但是,有一些标准我不能包含在单个数据库查询中 - 所以,我想渲染出“基础”可恢复列表,然后在返回客户端之前基本上对它运行一个过滤器。

换句话说,我要做的是:

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 个答案:

答案 0 :(得分:1)

这里的问题是你的“sessions”变量引用的是数组,而不是会话对象。你正在做的事情对于单个会话(类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 而不是特定于类的单对象序列化程序。