所以这是一个有趣的 - 我有一个控制器方法,它返回一个基于一些规则的“可恢复”对象列表。但是,有一些标准我不能包含在单个数据库查询中 - 所以,我想渲染出“基础”可恢复列表,然后在返回客户端之前基本上对它运行一个过滤器。
换句话说,我要做的是:
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>
错误。
我显然对这应该如何工作感到困惑 - 似乎完全直观的初始化程序将采用关系并将其渲染出来。
有没有更好的方法来解决这个问题?
答案 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 而不是特定于类的单对象序列化程序。