2

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

换句话说,我想做的是:

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>错误。

我显然对这应该如何工作感到困惑——初始化程序会获取一个关系并将其呈现出来,这似乎完全直观。

有没有更好的方法来解决这个问题?

4

1 回答 1

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而不是特定于类的单对象序列化程序。

于 2013-08-26T19:50:38.970 回答